正在尝试格式化 SQL 查询结果

Trying to format SQL query results

在 Stack Overflow 上找到了这个查询 here,我发现它非常有助于从 Microsoft SQL Server Enterprise Edition(64 位)10.50 中提取所有 table 名称和相应的列.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

它生成一个包含两列的 table,每行在第 01 列中有 table 名称,在第 02 列中有相应的列:

然而,我真正想要的是这样的,每个 table 名称一列,下面列出 tables 列,如下所示:

我已经开始在 Excel 中手动执行此操作,但是由于返回了 5000 多行,如果有一种方法可以将查询本身的结果格式化为如下所示,那就太好了。提前致谢!

例如,这样做可能最简单:

  1. 使用 XML 路径构建逗号分隔列表,例如 this
  2. 然后将该结果复制到 excel 并使用数据到列以从项目中创建单独的列
  3. 使用复制 + 特殊粘贴 -> 转置将行变成列

正如每个人都告诉你的那样,这是一件不 SQL 要做的事情。您的结果集将有任意数量的列(等于数据库中用户表的数量,这可能是巨大的)。由于结果集必须是矩形的,因此它的行数将与任何表中的 maximum 列数一样多,因此许多值将是 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)