尝试格式化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)
例如,这可能是最简单的做法: