简体   繁体   English

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

[英]query columns from many tables using dynamic SQL or Correlated Subquery on SQL Server INFORMATION_SCHEMA

I want to list all the Manufacturers identified in an SQL Server database. 我想列出SQL Server数据库中标识的所有Manufacturers

There are many tables with manufacturer names in them, but they are not always in a nicely named column. 有许多表中包含制造商名称,但它们并不总是在一个名称很好的列中。 However, column names are LIKE %manuf% . 但是,列名称 LIKE %manuf%

So: 所以:

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

gets me a list of tables I want to query from and the column name I want to query. 获取我想要查询的表的列表以及我想要查询的列名。

How can I now query the manufacturer names from those tables? 我现在如何从这些表中查询制造商名称?

If you want all of them returned in one result set you can use this query: 如果您希望在一个结果集中返回所有这些,则可以使用此查询:

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);

That requires all of them to be a (n)varchar data type. 这要求所有这些都是(n)varchar数据类型。 If you run into problems add a cast: 如果遇到问题,请添加一个演员:

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

This seems like a very odd database design. 这似乎是一个非常奇怪的数据库设计。 You might want to revisit that... 你可能想重新审视......


If INFORMATION_SCHEMA isn't working for you use this: 如果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);

While INFORMATION_SCHEMA is part of the ANSI standard, using the SQL Server catalog views is usually the preferred way to go anyway. 虽然INFORMATION_SCHEMA是ANSI标准的一部分,但使用SQL Server目录视图通常是首选的方法。


One more thing: If INFORMATION_SCHEMA returns incorrect results, you might have some kind of corruption going on, you should check that by running DBCC CHECKDB in that database. 还有一件事:如果INFORMATION_SCHEMA返回不正确的结果,您可能会遇到某种类型的损坏,您应该通过在该数据库中运行DBCC CHECKDB来检查它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 sql server 中 INFORMATION_SCHEMA 的等效查询 - Equivalent query in sql server for INFORMATION_SCHEMA SQL Server信息_架构 - SQL Server Information_Schema SQL Server 中 Information_schema 与 sys 表的区别 - Difference between Information_schema vs sys tables in SQL Server 使用SYS或INFORMATION_SCHEMA表发现SQL Server过程默认参数 - Discover SQL Server procedure default parameters using SYS or INFORMATION_SCHEMA tables SQL - 服务器上所有数据库的 INFORMATION_SCHEMA - SQL - INFORMATION_SCHEMA for All Databases On Server SQL Server:我应该在sys表上使用information_schema表吗? - SQL Server: should I use information_schema tables over sys tables? SQL Server如何使用information_schema.columns或sys.tables从表列表中进行选择? - SQL Server how to select from a list of tables using information_schema.columns or sys.tables? 如何在 SQL 服务器中找到所有带有 INFORMATION_SCHEMA 的表之间的所有关系? - How to find all the relations between all tables with INFORMATION_SCHEMA in SQL Server? 有关information_schema的AWS雅典娜SQL查询失败 - AWS athena SQL query on information_schema is failing SQL Server数据库缺少INFORMATION_SCHEMA和sys用户 - SQL Server database missing INFORMATION_SCHEMA and sys users
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM