尝试格式化SQL查询结果

在堆栈溢出中找到这个查询,我发现它非常有用,可以从Microsoft SQL Server企业版(64位)10.50.4286 SP2数据库中提取所有表名和相应的列。

SELECT   o.Name, c.Name
FROM     sys.columns c 
JOIN     sys.objects o ON o.object_id = c.object_id 
WHERE    o.type = 'U' 
ORDER BY o.Name, c.Name

它生成一个有两列的表,每列在01列中都有表名,在列02中有相应的列:

在这里输入图像描述

然而,我真正想要的是这样的,每个表名和下面列出的表列都是这样的:

在这里输入图像描述

我已经开始在Excel中手动执行此操作,但返回的行数超过5000行,如果有方法将查询中的结果格式化为看起来像这样,这将非常好。 提前致谢!


正如每个人都告诉你的,这是一个非SQL的事情。 您的结果集将有任意数量的列(等于数据库中用户表的数量,这可能很大)。 由于结果集必须是矩形,因此它的行数将与表中的最大列数一样多,因此很多值都是NULL

这就是说,一个简单的动态PIVOT让你得到你想要的东西:

DECLARE @columns nvarchar(max);
DECLARE @sql nvarchar(max);

SET @columns = STUFF ( ( 
                   SELECT '],[' + t.name 
                   FROM sys.tables t 
                   WHERE t.type = 'U' 
                   FOR XML PATH('') ), 1, 2, '') 
               + ']';

SET @sql = '
    SELECT ' + @columns + ' 
    FROM
    ( 
        SELECT   t.Name tName
                 , c.Name cName
                 , ROW_NUMBER() OVER (PARTITION BY t.Name ORDER BY c.Name) rn
        FROM     sys.columns c 
        JOIN     sys.tables t ON t.object_id = c.object_id 
        WHERE    t.type = ''U'' 
    ) raw
    PIVOT (MAX(cName) FOR tName IN ( ' + @columns + ' )) 
    AS pvt;
    ';

EXECUTE(@sql);

这是它在我的master数据库上生成的内容:

spt_fallback_db     spt_fallback_dev    spt_fallback_usg    spt_monitor     MSreplication_options
------------------- ------------------- ------------------- --------------- ----------------------
dbid                high                dbid                connections     install_failures
name                low                 lstart              cpu_busy        major_version
status              name                segmap              idle            minor_version
version             phyname             sizepg              io_busy         optname
xdttm_ins           status              vstart              lastrun         revision
xdttm_last_ins_upd  xdttm_ins           xdttm_ins           pack_errors     value
xfallback_dbid      xdttm_last_ins_upd  xdttm_last_ins_upd  pack_received   NULL
xserver_name        xfallback_drive     xfallback_vstart    pack_sent       NULL
NULL                xfallback_low       xserver_name        total_errors    NULL
NULL                xserver_name        NULL                total_read      NULL
NULL                NULL                NULL                total_write     NULL

(11 row(s) affected)

例如,这可能是最简单的做法:

  • 例如,使用XML路径构建逗号分隔列表。
  • 然后将该结果复制到excel并将数据用于列以从项目创建单独的列
  • 使用复制+粘贴特殊 - >转置将行转换为列
  • 链接地址: http://www.djcxy.com/p/93847.html

    上一篇: Trying to format SQL query results

    下一篇: Using Dataset for Microsoft reporting