【发布时间】:2020-02-20 12:31:11
【问题描述】:
我想计算具有特定列名的表。例如,dbo.Management 有 300 个表。有些表有ProtectionKey 列,有些则没有。
我需要一个包含该列ProtectionKey 的所有表的列表,或者至少是其中的一个计数。
我研究过类似的示例,但这些示例要么计算数据库中的所有列,要么计算一个表中的所有列。
【问题讨论】:
标签: sql sql-server
我想计算具有特定列名的表。例如,dbo.Management 有 300 个表。有些表有ProtectionKey 列,有些则没有。
我需要一个包含该列ProtectionKey 的所有表的列表,或者至少是其中的一个计数。
我研究过类似的示例,但这些示例要么计算数据库中的所有列,要么计算一个表中的所有列。
【问题讨论】:
标签: sql sql-server
我个人会为此使用sys 对象,因为INFORMATION_SCHEMA 可能返回不正确的信息:
SELECT s.[name] AS SchemaName,
t.[name] AS TableName
FROM sys.schemas s
JOIN sys.tables t ON s.schema_id = t.schema_id
JOIN sys.columns c ON t.object_id = c.object_id
WHERE c.[name] = N'ProtectionKey';
【讨论】:
使用INFORMATION_SCHEMA.COLUMNS:
select c.*
from INFORMATION_SCHEMA.COLUMNS c
where column_name = 'ProtectionKey';
这有很多列。你想要的是TABLE_NAME和TABLE_SCHEMA。
此外,这一次只能在一个数据库中运行,因此您需要在要搜索表的每个数据库中运行它。
【讨论】:
TABLE_SCHEMA 可能是错误的,来自Docs:"** 重要 ** 不要使用 INFORMATION_SCHEMA 视图来确定对象的架构。查找对象架构的唯一可靠方法是查询 sys.objects 目录视图。”
EXEC sp_helptext 'INFORMATION_SCHEMA.COLUMNS',你会看到 TABLE_SCHEMA 是从 sys.objects 应用 SCHEMA_NAME 到 schema_id 派生的,所以不确定该警告是否已过时跨度>
sys.objects,在VIEW 中使用SCHEMA_NAME(),这向我表明问题是SCHEMA_NAME();但这是我第一次听说。
SCHEMA_NAME() 的文档中没有类似的警告,所以如果这是问题,也应该在那里提及