我目前正在开发一个包含 3k+ 表的大型且高度规范化的数据库。除了一个小数据字典之外,没有任何文档可以帮助我找到正确的数据(它来自接管)。
有没有办法创建一个 SQL 脚本来为我提供所有表的所有列以及所有内容?结果应该与将每个表中的每个列单独分组相同。
希望你能捕获我。抱歉,我的英语现在有点生疏。
如果 SQL Server 2008(标准版)中没有办法,我将用 Java 或 C# 创建一个小助手。
提前致谢! bg 帕特里克
最佳答案
像这样尝试一下。该语句将生成一个语句,例如
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);
关于SQL Server 2008 Standard,获取包含所有列的所有表以及列中可能的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39912127/