使用SQL Server INFORMATION_SCHEMA上的动态SQL或相关子查询从许多表中查询列

时间:2013-02-13 17:20:50

标签: sql sql-server dynamic-sql information-schema correlated-subquery

我想列出SQL Server数据库中标识的所有Manufacturers

有许多表中包含制造商名称,但它们并不总是在一个名称很好的列中。但是,列名 LIKE %manuf%

所以:

SELECT TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME LIKE '%manuf%' 
ORDER BY TABLE_NAME;

获取我想要查询的表的列表以及我想要查询的列名。

我现在如何从这些表中查询制造商名称?

1 个答案:

答案 0 :(得分:2)

如果您希望在一个结果集中返回所有这些结果集,则可以使用此查询:

DECLARE @cmd NVARCHAR(MAX);

SET @cmd = STUFF((
SELECT ' UNION ALL SELECT '+QUOTENAME(COLUMN_NAME)+' FROM '+QUOTENAME(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME LIKE '%manuf%' 
ORDER BY TABLE_NAME
FOR XML PATH(''),TYPE
).value('.','NVARCHAR(MAX)'),1,11,'')
;

EXEC( @cmd);

这要求所有这些都是(n)varchar数据类型。如果遇到问题,请添加一个演员:

SELECT ' UNION ALL SELECT CAST('+QUOTENAME(COLUMN_NAME)+' AS NVARCHAR(MAX)) FROM '+QUOTENAME(TABLE_NAME)

这似乎是一个非常奇怪的数据库设计。你可能想重新审视......


如果INFORMATION_SCHEMA不起作用,请使用此功能:

DECLARE @cmd NVARCHAR(MAX);

SET @cmd = STUFF((
SELECT ' UNION ALL SELECT '+QUOTENAME(c.name)+' FROM dbo.'+QUOTENAME(t.name)
FROM sys.columns c
JOIN sys.tables t
ON c.object_id = t.object_id
WHERE c.name LIKE '%name%' 
AND t.is_ms_shipped = 0
ORDER BY t.name
FOR XML PATH(''),TYPE
).value('.','NVARCHAR(MAX)'),1,11,'')
;

EXEC( @cmd);

虽然INFORMATION_SCHEMA是ANSI标准的一部分,但使用SQL Server目录视图通常是首选的方法。


还有一件事:如果INFORMATION_SCHEMA返回不正确的结果,您可能会遇到某种类型的损坏,您应该通过在该数据库中运行DBCC CHECKDB来检查它。