SQL Server:返回一组数据库表共享的列列表

SQL Server:返回一组数据库表共享的列列表,sql,sql-server,Sql,Sql Server,我继承了一个我们希望自动化的大型报告。我相信大部分数据都在数据仓库中,我可以通过SQL Server访问这些数据。我的问题是,我没有很多文档数据字典、模式等,我想确定几个表中哪些字段是公共的。通常,当我想要返回表和列的列表时,我会查询信息模式。但是,在本例中,我基本上是在寻找一个类似以下内容的查询: select table_name, column_name from (information_schema, others?) where table_name like 'T_Blah %'

我继承了一个我们希望自动化的大型报告。我相信大部分数据都在数据仓库中,我可以通过SQL Server访问这些数据。我的问题是,我没有很多文档数据字典、模式等,我想确定几个表中哪些字段是公共的。通常,当我想要返回表和列的列表时,我会查询信息模式。但是,在本例中,我基本上是在寻找一个类似以下内容的查询:

select table_name, column_name
from (information_schema, others?)
where table_name like 'T_Blah %'
and column_names are equal
我意识到我可以通过对象浏览器实现这一点,但一旦我开始进入更多的表,我希望使用一种基于查询的快速方法来识别要加入的字段


我很感激能得到的任何帮助。我在谷歌上搜索了一会儿,但没有找到解决方案,或者我没有意识到我已经找到了解决方案。

如果我理解正确,您可以尝试以下方法:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
SELECT TABLE_NAME, COLUMN_NAME
FROM (  SELECT *, COUNT(*) OVER(PARTITION BY COLUMN_NAME) Quant
        FROM INFORMATION_SCHEMA.COLUMNS) A
WHERE TABLE_NAME LIKE 'T_Blah%' AND Quant > 1
ORDER BY COLUMN_NAME, TABLE_NAME

这应该适用于sql server。这只是我手头的一个问题,所以比你要求的要多一些。但是,我保留了它,以防你需要额外的信息:。如果没有,就把它取下来

select distinct columns.name, schemas.name + '.' + tables.name  
from sys.columns 
join sys.tables 
    on tables.object_id = columns.object_id 
join sys.schemas 
    on schemas.schema_id = tables.schema_id
where tables.name like '%blah%'
order by  columns.name, schemas.name + '.' + tables.name 

除了信息模式之外,您还有系统表syscolumns。假设您使用前一种方法,类似这样的方法应该会起作用:

select column_name, count(distinct table_name)  
from information_schema.columns  
group by column_name  
having count(distinct table_name) > 1

显然,如果要查看子集,可以通过表名/模式进行限制,这将在指定表中生成列名和数据类型,这些列名和数据类型也会出现在其他表中,后面是以逗号分隔的表列表,这些列名和数据类型会出现在这些表中:

SELECT     COLUMN_NAME, DATA_TYPE, REPLACE(REPLACE(REPLACE(
                   (SELECT     TABLE_NAME
                    FROM         INFORMATION_SCHEMA.COLUMNS
                    WHERE     (COLUMN_NAME = CommonColumns.COLUMN_NAME) AND (DATA_TYPE = CommonColumns.DATA_TYPE)
                    FOR XML PATH(''))
                , '</TABLE_NAME><TABLE_NAME>', ', '), '<TABLE_NAME>', ''), '</TABLE_NAME>', '') 
                      AS Tables
FROM         (SELECT DISTINCT COLUMN_NAME, DATA_TYPE
              FROM          INFORMATION_SCHEMA.COLUMNS
              WHERE     TABLE_NAME LIKE 'T_Blah%') AS CommonColumns
WHERE     (SELECT     COUNT(TABLE_NAME)
           FROM         INFORMATION_SCHEMA.COLUMNS
           WHERE     (COLUMN_NAME = CommonColumns.COLUMN_NAME) AND (DATA_TYPE = CommonColumns.DATA_TYPE)) > 1
要通过外键获取关系,请使用:

SELECT     sys.foreign_keys.name AS ForeignKeyName, OBJECT_NAME(sys.foreign_key_columns.parent_object_id) AS ForeignKeyTableName, 
                      ForeignKeyColumns.name AS ForeignKeyColumnName, OBJECT_NAME(sys.foreign_key_columns.referenced_object_id) AS ReferencedTableName, 
                      ReferencedColumns.name AS ReferencedColumnName
FROM         sys.foreign_keys INNER JOIN
                      sys.foreign_key_columns ON sys.foreign_keys.object_id = sys.foreign_key_columns.constraint_object_id INNER JOIN
                      sys.columns AS ForeignKeyColumns ON sys.foreign_key_columns.parent_object_id = ForeignKeyColumns.object_id AND 
                      sys.foreign_key_columns.parent_column_id = ForeignKeyColumns.column_id INNER JOIN
                      sys.columns AS ReferencedColumns ON sys.foreign_key_columns.referenced_object_id = ReferencedColumns.object_id AND 
                      sys.foreign_key_columns.referenced_column_id = ReferencedColumns.column_id
WHERE     (OBJECT_NAME(sys.foreign_key_columns.parent_object_id) LIKE 'T_Blah%') OR (OBJECT_NAME(sys.foreign_key_columns.referenced_object_id) 
                      LIKE 'T_Blah%')

我建议不要使用信息模式——原因如下:是否有理由假定列名相等?外键很少有相同的名称,例如。。。在我的桌子上。person\u id=person.id谢谢,在我稍微调整了一下之后,它似乎起了作用。我真的只关心出现在多个表中的列,所以这部分地让我达到了目的。以下内容仅返回出现在多个表中的列的表和列列表:Oops select table_name,信息模式中的列名称。信息模式中的列名称。信息模式中的列名称。信息模式中的列名称。表名称如“T_Blah”的列名称按列名称分组,表名称如“T_Blah”>1和表名称如“T_Blah”@Jeremy我相信这个答案应该涵盖您想要的几乎所有内容。谢谢。这看起来比我所用的更加雄辩和彻底,尽管我同意上面的另一种方法也让我达到了目的。非常感谢!
SELECT     sys.foreign_keys.name AS ForeignKeyName, OBJECT_NAME(sys.foreign_key_columns.parent_object_id) AS ForeignKeyTableName, 
                      ForeignKeyColumns.name AS ForeignKeyColumnName, OBJECT_NAME(sys.foreign_key_columns.referenced_object_id) AS ReferencedTableName, 
                      ReferencedColumns.name AS ReferencedColumnName
FROM         sys.foreign_keys INNER JOIN
                      sys.foreign_key_columns ON sys.foreign_keys.object_id = sys.foreign_key_columns.constraint_object_id INNER JOIN
                      sys.columns AS ForeignKeyColumns ON sys.foreign_key_columns.parent_object_id = ForeignKeyColumns.object_id AND 
                      sys.foreign_key_columns.parent_column_id = ForeignKeyColumns.column_id INNER JOIN
                      sys.columns AS ReferencedColumns ON sys.foreign_key_columns.referenced_object_id = ReferencedColumns.object_id AND 
                      sys.foreign_key_columns.referenced_column_id = ReferencedColumns.column_id
WHERE     (OBJECT_NAME(sys.foreign_key_columns.parent_object_id) LIKE 'T_Blah%') OR (OBJECT_NAME(sys.foreign_key_columns.referenced_object_id) 
                      LIKE 'T_Blah%')