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

时间:2012-02-29 18:42:29

标签: sql sql-server

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

select table_name, column_name
from (information_schema, others?)
where table_name like 'T_Blah %'
and column_names are equal

我意识到我可以通过对象浏览器实现这一点,但是一旦我开始涉及更多的表,我想要一种基于查询的快速方法来识别我的字段以便加入。

我感谢任何帮助。我用Google搜索了一段时间,但我没有找到解决方案(或者我没有注意到我找到了一个解决方案)。

5 个答案:

答案 0 :(得分:1)

除信息模式外,您还拥有系统表syscolumns。假设你使用前者,这样的东西应该有效:

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

显然,如果你想查看一个子集

,你可以通过表名/模式进行限制

答案 1 :(得分:0)

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 

答案 2 :(得分:0)

如果我理解你的正确,你可以试试这个:

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

答案 3 :(得分:0)

这适用于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 

答案 4 :(得分:0)

这将产生指定表中的列名和数据类型,这些列也出现在其他表中,后面跟着一个以逗号分隔的表列表:

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

要让它对所有表执行此操作,只需删除WHERE TABLE_NAME LIKE 'T_Blah%'

或者如Aaron建议的那样,请避免使用INFORMATION_SCHEMA:

SELECT     ColumnName, sys.types.name AS DataType, REPLACE(REPLACE(REPLACE(
                   (SELECT     sys.tables.name AS TableName
                    FROM         sys.columns INNER JOIN
                                          sys.tables ON sys.columns.object_id = sys.tables.object_id
                    WHERE     (sys.tables.type = 'U') AND (sys.columns.name = CommonColumns.ColumnName) AND 
                                          (sys.columns.system_type_id = CommonColumns.system_type_id)
                    FOR XML PATH(''))
                , '</TableName><TableName>', ', '), '<TableName>', ''), '</TableName>', '') 
                      AS Tables
FROM         (SELECT DISTINCT sys.columns.name AS ColumnName, sys.columns.system_type_id
              FROM          sys.columns INNER JOIN
                                              sys.tables ON sys.columns.object_id = sys.tables.object_id
              WHERE      (sys.tables.type = 'U') AND (sys.tables.name LIKE 'T_Blah%')) AS CommonColumns INNER JOIN
                                     sys.types ON sys.types.system_type_id = CommonColumns.system_type_id
WHERE     ((SELECT     COUNT(sys.tables.object_id) AS TableCount
                         FROM         sys.columns INNER JOIN
                                               sys.tables ON sys.columns.object_id = sys.tables.object_id
                         WHERE     (sys.tables.type = 'U') AND (sys.columns.name = CommonColumns.ColumnName) AND 
                                               (sys.columns.system_type_id = CommonColumns.system_type_id)) > 1)
ORDER BY CommonColumns.ColumnName, sys.types.name

要通过外键获取关系,请使用:

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%')