2012-02-29 22 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