在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列中的相应列:
我真正想要的是这样的,每个表名的一列和下面列出的表列如下:
我已经开始在Excel中手动执行此操作,但是如果有一种方法可以将查询本身的结果格式化为这样,那么返回超过5000行会非常好。提前谢谢!
答案 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)
最简单的做法就是这样: