2016-10-07 33 views
2

我目前正在使用3k +表進行高度規範化的大型數據庫。除了小型的數據字典外,沒有任何文件可以幫助我找到正確的數據(它來自收購)。SQL Server 2008 Standard,獲取列中所有列和可能的數據的所有表

有什麼辦法可以創建一個SQL腳本,它會給我所有表的所有列的所有內容?結果應該與每個表中單獨列出每個列相同。

我希望你能找到我。抱歉,我的英語此刻有點生疏。

如果在SQL Server 2008(Standard)中沒有辦法,我會在Java或C#中爲我創建一個小幫手。

在此先感謝! bg Patrick

+3

[讓所有表和列(https://stackoverflow.com/questions/420741 /獲取數據庫中的表和字段) – user5226582

+1

您可能會看到:http://stackoverflow.com/a/39518959/5089204此​​解決方案將返回一個大的XML與整個數據庫。在列的數據類型中添加元數據很容易。如果你的數據庫非常大,你可以在創建的語句中添加一個「TOP 5」。這將只返回一些行。足以得到結構... – Shnugo

+0

嗨,如果你有興趣在上面鏈接的答案,我只是編輯它,以避免與二進制列的問題... – Shnugo

回答

2

試試吧。此聲明將生成一條語句,如

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); 
+0

這解決了我的問題,謝謝隊友! – Pad

相關問題