SQL Server 2008 Standard,获取包含所有列的所有表以及列中可能的数据

标签 sql sql-server-2008 reverse-engineering

我目前正在开发一个包含 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/

相关文章:

ios - 找到 mach_msg 服务器端的好方法吗?

sql - 无法更新逻辑表 INSERTED 和 DELETED

php - MySQL在多对多连接中复制记录

c# - 过程或函数 'ValidateUserLogin' 需要参数 '@UserName',但未提供

java - 结果集 getDate() 返回了错误的日期值

sql-server - 复制数据库的最佳方法 (SQL Server 2008)

reverse-engineering - 如何将radare2用于PIC32 MX534F064H

linux - 如何从 Mobile Partner Modem Software 获取 AT 终端命令日志 (Linux)?

mysql - PL/SQL 错误 - 精确获取返回的行数超过请求的行数

mysql - 列和行 (SQL)