像这样试试。该语句将生成一个语句,如
SELECT colABC FROM SomeTable GROUP BY colABC
对于每一列,并在一个 XML 中返回全部内容。
但请注意,这可能会变得非常庞大并且可能需要数小时。对于我的测试,我排除了一些倾向于保存未分组数据
的数据类型
您肯定会遇到异常,即生成的语句有很多列。将输入减少为合适的表名称或将查询分成几部分。
出于测试目的,有一个TOP 100,您必须按照自己的逻辑删除并替换它:
DECLARE @Commands TABLE(ID INT IDENTITY,cmd NVARCHAR(MAX));
WITH AllColumns AS
(
SELECT t.TABLE_CATALOG,t.TABLE_SCHEMA,t.TABLE_NAME,c.COLUMN_NAME,c.ORDINAL_POSITION,c.DATA_TYPE
FROM INFORMATION_SCHEMA.TABLES AS t
INNER JOIN INFORMATION_SCHEMA.COLUMNS AS c ON c.TABLE_CATALOG=t.TABLE_CATALOG AND c.TABLE_SCHEMA=t.TABLE_SCHEMA AND c.TABLE_NAME=t.TABLE_NAME
WHERE t.TABLE_TYPE='BASE TABLE'
)
INSERT INTO @Commands(cmd)
SELECT TOP 100 '(SELECT ' + QUOTENAME(COLUMN_NAME) + ' AS [*]'
+ ' FROM ' + QUOTENAME(TABLE_CATALOG) + '.' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
+ ' GROUP BY ' + QUOTENAME(COLUMN_NAME)
+ ' FOR XML PATH(''x''),TYPE) AS ' + QUOTENAME(TABLE_CATALOG + '_' + TABLE_SCHEMA + '_' + TABLE_NAME + '_' + COLUMN_NAME)
FROM AllColumns
WHERE DATA_TYPE NOT IN('image','text','uniqueidentifier','datetime','xml') AND DATA_TYPE NOT LIKE '%binary%' ;
DECLARE @finalCommand NVARCHAR(MAX)=
(
SELECT 'SELECT '
+ STUFF(
(
SELECT ',' + cmd
FROM @Commands
ORDER BY ID
FOR XML PATH('')
),1,1,''
)
+ ' FOR XML PATH(''AllColumnsDistinct'')'
);
EXEC( @finalCommand);