【问题标题】:How to check column names present in all the tables in Database如何检查数据库中所有表中存在的列名
【发布时间】:2019-03-13 10:29:20
【问题描述】:

我正在尝试编写一个查询,我可以在其中检查某些列名是否存在于数据库中的所有表中。 为了避免困难,我试图一次访问所有表并检查表中是否存在列。 我能够找到下面的代码来获取表名:

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='SAMPLE_DB_NAME'  

我无法进入每个表并检查列名。

如果有人可以帮助我查询进入每个表并检查所有表的常量列名。

【问题讨论】:

  • 所以,如果我正确理解您的推断问题,您正在寻找没有N'{Your Column Name} 列的表格?
  • 是的,但是我想在一个表中搜索多个列(共 6 个),而我的数据库共有 36 个表。
  • @RAMAN BHATIA - 您可以尝试以下我建议的查询。您可以使用 IN 子句传递尽可能多的列。

标签: sql-server ssms sql-server-2016


【解决方案1】:

试试这个

SELECT  TABLE_CATALOG,
        TABLE_NAME,
        COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_CATALOG='SAMPLE_DB_NAME' 
AND CHARINDEX('Status',COLUMN_NAME) = 1 -- Specify the column name to check the column is existed
                                        --- in the datbase of all available tables 

【讨论】:

    【解决方案2】:
    --List of tables
    SELECT * FROM sys.tables
    
    --List of Columns
    SELECT * FROM sys.columns
    
    --List of Columns Tables joined
    SELECT tbl.[name] AS TableName, clm.[name] AS ColumnName FROM sys.tables as tbl INNER JOIN sys.columns as clm ON tbl.[object_id] = clm.[object_id]
    
    
    
    -You can check with the column name if the column exist in all tables 
    USE MyDataBase
    DECLARE @TableCount INT
    DECLARE @FoundTables INT
    SET @TableCount = ( SELECT COUNT(*) FROM sys.tables)
    SET @FoundTables = ( SELECT COUNT(DISTINCT(tbl.[name])) AS NumberOfTables FROM sys.tables as tbl INNER JOIN sys.columns as clm ON tbl.[object_id] = clm.[object_id] WHERE clm.[name] = 'YourColumnName')
    
    IF @FoundTables = @TableCount
     BEGIN
       PRINT 'The column is present in all tables'
     END
    ELSE
     BEGIN 
       PRINT 'The column is not present in all tables'
     END
    

    【讨论】:

      【解决方案3】:

      通过此查询,您可以获得所有表中存在的所有列

      WITH DistinctColumnNames AS (
          SELECT DISTINCT Column_Name 
          FROM INFORMATION_SCHEMA.COLUMNS C
          JOIN INFORMATION_SCHEMA.TABLES T ON C.TABLE_SCHEMA = T.TABLE_SCHEMA AND C.TABLE_NAME = T.TABLE_NAME AND C.TABLE_CATALOG = T.TABLE_CATALOG
          WHERE T.TABLE_TYPE = 'BASE TABLE' AND T.TABLE_CATALOG='SAMPLE_DB_NAME' AND T.TABLE_SCHEMA = 'dbo' AND T.TABLE_NAME NOT LIKE 'sys%'
      )
      SELECT COLUMN_NAME
      FROM DistinctColumnNames DC
      WHERE NOT EXISTS (
          SELECT 1 
          FROM INFORMATION_SCHEMA.TABLES T
          WHERE T.TABLE_TYPE = 'BASE TABLE' AND T.TABLE_CATALOG='SAMPLE_DB_NAME' AND T.TABLE_SCHEMA = 'dbo' AND T.TABLE_NAME NOT LIKE 'sys%'
          AND NOT EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C
              WHERE C.TABLE_NAME = T.TABLE_NAME AND C.COLUMN_NAME = DC.COLUMN_NAME
               AND T.TABLE_CATALOG='SAMPLE_DB_NAME' AND T.TABLE_SCHEMA = 'dbo')
      )
      

      【讨论】:

        【解决方案4】:

        以下查询将列出不存在任何给定特定字段的所有表名。

        SELECT distinct TABLE_NAME
        FROM INFORMATION_SCHEMA.TABLES
        WHERE  TABLE_CATALOG='testdb' 
        and TABLE_NAME not in(
        select object_name(object_id) ObjectName from sys.COLUMNS where name  in ('YourfieldName1', 'YourfieldName2')
        

        下面的查询将列出所有可以找到指定字段的表名。

        select object_name(object_id) ObjectName, * 
        from sys.COLUMNS where name  in ('YourfieldName1', 'YourfieldName2')
        

        【讨论】:

          猜你喜欢
          • 2011-02-13
          • 1970-01-01
          • 1970-01-01
          • 2014-09-23
          • 2015-04-03
          • 2023-03-26
          • 2012-07-26
          • 2012-09-23
          • 2021-12-05
          相关资源
          最近更新 更多