2012-02-29 39 views
0

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

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

我知道我可以通过对象浏览器到这一点,但一旦我开始进入表的数量较多,我想要一个快速的基于查询的方法来识别要加入的字段。

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

+0

我建议从'INFORMATION_SCHEMA'避而远之 - 这里的原因:HTTP:// sqlblog .com/blogs/aaron_bertrand/archive/2011/11/03/the-case-against-information-schema-views.aspx – 2012-02-29 18:50:02

+0

是否有理由认为column_names是相等的?外键很少有相同的名称(例如'... on my_table.person_id = person.id') – Aprillion 2012-02-29 18:50:04

回答

0
SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
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 
0

这应该为SQL服务器的工作。这只是我手头上的一个查询,所以它比您要求的要多一点。但是,我保留它,以防您需要额外的信息:)。如果不是,请将其删除。

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 
1

除了信息架构,您还有系统表syscolumns。假设你使用前者,这样的事情应该工作:

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

很明显,你可以按表名/模式,如果你想看看一个子集

+0

谢谢,这似乎工作后,我调整了一下。我真的只关心列表出现在多个表格中的列,所以这部分让我在那里。下面只返回出现在多个表列的表和列的列表: – Jeremy 2012-02-29 19:20:30

+1

哎呀选择表名,从INFORMATION_SCHEMA.COLUMNS 其中列名中(从INFORMATION_SCHEMA选择列名 列名 。列 哪里像“T_Blah” 组table_name的通过列名 具有计数(不同的表名)> 1) 和表名,如“T_Blah” – Jeremy 2012-02-29 19:21:26

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

或者像亚伦建议,避免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%') 
+0

@Jeremy我相信这个答案应该包括你想要几乎一切。 – JamieSee 2012-03-02 20:03:23

+0

谢谢。这看起来比我使用的更加雄辩和彻底,尽管我上面同意的另一种方法也让我在那里。非常感激! – Jeremy 2012-03-05 01:30:08