尝试格式化SQL查询结果

时间:2015-06-25 14:12:15

标签: sql sql-server formatting

在Stack Overflow上找到此查询here,我发现从Microsoft SQL Server Enterprise Edition(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列中的相应列:

enter image description here

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

enter image description here

我已经开始在Excel中手动执行此操作,但是如果有一种方法可以将查询本身的结果格式化为这样,那么返回超过5000行会非常好。提前谢谢!

2 个答案:

答案 0 :(得分:2)

正如大家都在告诉你的那样,这是一个非SQL-y的事情。结果集将具有任意数量的列(等于数据库中用户表的数量,这可能很大)。由于结果集必须是矩形,因此它将包含与任何表中最大列数一样多的行,因此许多值将为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)

答案 1 :(得分:0)

最简单的做法就是这样:

  1. 使用for XML路径构建逗号分隔列表,例如this
  2. 然后将该结果复制到Excel并将数据用于列以从项目
  3. 创建单独的列
  4. 使用copy + paste special - >转置以将行转换为列