【问题标题】:How to count specific column name in all tables of one SQL Server Database object如何计算一个 SQL Server 数据库对象的所有表中的特定列名
【发布时间】:2020-02-20 12:31:11
【问题描述】:

我想计算具有特定列名的表。例如,dbo.Management 有 300 个表。有些表有ProtectionKey 列,有些则没有。

我需要一个包含该列ProtectionKey 的所有表的列表,或者至少是其中的一个计数。 我研究过类似的示例,但这些示例要么计算数据库中的所有列,要么计算一个表中的所有列。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    我个人会为此使用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';
    

    【讨论】:

    • 我不是很高级,应该替换哪些字段以匹配我的数据库名称?
    • 无,@HomeMade,您在连接到数据库的情况下运行查询。
    • 嗯,我在该查询之前添加了“使用管理”,结果为零。
    • 或者运行脚本的账号没有权限查看
    • 好点,@MartinSmith。我假设 OP 在“特权”帐户上运行。 ;)
    【解决方案2】:

    使用INFORMATION_SCHEMA.COLUMNS

    select c.*
    from INFORMATION_SCHEMA.COLUMNS c
    where column_name = 'ProtectionKey';
    

    这有很多列。你想要的是TABLE_NAMETABLE_SCHEMA

    此外,这一次只能在一个数据库中运行,因此您需要在要搜索表的每个数据库中运行它。

    【讨论】:

    • TABLE_SCHEMA 可能是错误的,来自Docs"** 重要 ** 不要使用 INFORMATION_SCHEMA 视图来确定对象的架构。查找对象架构的唯一可靠方法是查询 sys.objects 目录视图。”
    • @Larnu - 如果你这样做 EXEC sp_helptext 'INFORMATION_SCHEMA.COLUMNS',你会看到 TABLE_SCHEMA 是从 sys.objects 应用 SCHEMA_NAMEschema_id 派生的,所以不确定该警告是否已过时跨度>
    • 我已经问过the question,如果您对答案感兴趣,@MartinSmith。似乎in September 2019 这仍然是一个“问题”,但他们没有提供有关原因的信息。事实上在下面使用sys.objects,在VIEW 中使用SCHEMA_NAME(),这向我表明问题是SCHEMA_NAME();但这是我第一次听说。
    • @Larnu 谢谢。 SCHEMA_NAME() 的文档中没有类似的警告,所以如果这是问题,也应该在那里提及
    • 同意,@MartinSmith 以及我在 GitHub 报告中提到它的原因。希望这不会被掩盖为“仍然很糟糕,请关闭”没有回应原因。
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2011-02-13
    • 2011-07-13
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多