試試吧。此聲明將生成一條語句,如
SELECT colABC FROM SomeTable GROUP BY colABC
對於每個單列,並將整個批次返回到一個XML中。
但請注意,這可能會變得很大,可能需要幾個小時。對於我的測試,我排除了一些傾向於保留的數據類型未分組數據
您將會 - 當然 - 得到例外情況,即生成的語句必須包含多個列。減少對正常tabel名稱的輸入或將查詢拆分成部分。
出於測試目的有一個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);
[讓所有表和列(https://stackoverflow.com/questions/420741 /獲取數據庫中的表和字段) – user5226582
您可能會看到:http://stackoverflow.com/a/39518959/5089204此解決方案將返回一個大的XML與整個數據庫。在列的數據類型中添加元數據很容易。如果你的數據庫非常大,你可以在創建的語句中添加一個「TOP 5」。這將只返回一些行。足以得到結構... – Shnugo
嗨,如果你有興趣在上面鏈接的答案,我只是編輯它,以避免與二進制列的問題... – Shnugo