SQL Server 2008 Standard,获取包含所有列和列中可能数据的所有表
SQL Server 2008 Standard, get all tables with all columns and possible data within the colums
我目前正在处理一个具有 3k+ tables 的大型高度规范化数据库。除了一个小数据字典之外,没有任何文档可以帮助我找到正确的数据(它来自收购)。
有什么方法可以创建一个 SQL 脚本,它会给我所有 table 的所有列以及所有内容吗?结果应该与在每个 table 中单独分组每一列相同。
我希望你明白我的意思。对不起,我的英语现在有点生疏。
如果在SQL Server 2008 (Standard) 中没有办法,我会在Java 或C# 中创建一个小帮手。
提前致谢! bg 帕特里克
像这样尝试。该语句将生成一条语句,如
SELECT colABC FROM SomeTable GROUP BY colABC
每一列和 return 全部在一个 XML.
但请注意,这可能会变得很大并且可能需要几个小时。对于我的测试,我排除了一些数据类型,这些数据类型倾向于保存 ungrouped data
您肯定会遇到异常,即生成的语句有很多列。减少对合适的表格名称的输入或将查询分成几部分。
出于测试目的,有一个 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);
我目前正在处理一个具有 3k+ tables 的大型高度规范化数据库。除了一个小数据字典之外,没有任何文档可以帮助我找到正确的数据(它来自收购)。
有什么方法可以创建一个 SQL 脚本,它会给我所有 table 的所有列以及所有内容吗?结果应该与在每个 table 中单独分组每一列相同。
我希望你明白我的意思。对不起,我的英语现在有点生疏。
如果在SQL Server 2008 (Standard) 中没有办法,我会在Java 或C# 中创建一个小帮手。
提前致谢! bg 帕特里克
像这样尝试。该语句将生成一条语句,如
SELECT colABC FROM SomeTable GROUP BY colABC
每一列和 return 全部在一个 XML.
但请注意,这可能会变得很大并且可能需要几个小时。对于我的测试,我排除了一些数据类型,这些数据类型倾向于保存 ungrouped data
您肯定会遇到异常,即生成的语句有很多列。减少对合适的表格名称的输入或将查询分成几部分。
出于测试目的,有一个 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);