【问题标题】:SQL Server 2008 Standard, get all tables with all columns and possible data within the columsSQL Server 2008 Standard,获取所有列的所有表以及列中的可能数据
【发布时间】:2016-10-07 07:49:32
【问题描述】:

我目前正在开发一个包含 3k+ 表的大型且高度规范化的数据库。除了一个小型数据字典外,没有任何文档可以帮助我找到正确的数据(它来自收购)。

有没有什么方法可以创建一个 SQL 脚本,它会给我所有表的所有列以及所有内容?结果应该与将每个表中的每一列单独分组相同。

我希望你得到我。抱歉,我的英语现在有点生疏了。

如果在 SQL Server 2008 (Standard) 中没有办法,我会用 Java 或 C# 创建一个小助手。

提前致谢! bg帕特里克

【问题讨论】:

  • 你可能会看到这个:stackoverflow.com/a/39518959/5089204 这个解决方案将返回一个包含整个数据库的大 XML。在列的数据类型中添加元数据很容易。如果您的数据库很大,您可以在创建的语句中添加TOP 5。这将只返回一些行。足以得到结构......
  • 嗨,如果您对上面链接的答案感兴趣,我只是对其进行了编辑以避免二进制列出现问题...
  • @user5226582,我认为,你的链接没有帮助......我和你一样,但是 - 再次阅读 - 我认为 OP 想要了解现有值的概述.

标签: sql sql-server-2008 reverse-engineering


【解决方案1】:

像这样试试。该语句将生成一个语句,如

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多