2011-09-06 49 views
1

我遇到了一個棘手的問題。我有一個使用Microsoft SQL 2008的數據庫,在這個數據庫中有很多表。這些表格是自動生成的,沒有有意義的名稱。我需要一個特定的表格,而且我似乎無法找到它。訪問數據庫元數據

我知道表中一些列的名稱被調用。有沒有辦法讓我可以一次一個地查看所有表格,查看列的名稱,並查看它們是否與我所知道的相匹配。

如果他們這樣做,那麼我可以看看更遠的表,看看它是否是我正在尋找的。這聽起來像是解決問題的好方法嗎?可能嗎?任何想法從哪裏開始?

回答

2
SELECT OBJECT_SCHEMA_NAME([object_id]), 
    OBJECT_NAME([object_id]) 
    FROM sys.columns 
    WHERE name IN ('column 1', 'column 2' 
    /* , ... other columns */); 

編輯的要求,在案件意味着OP爲ALL識別與ANY:使用INFORMATION_SCHEMA.COLUMNS代替SYS.COLUMNS的

SELECT OBJECT_SCHEMA_NAME([object_id), name 
FROM sys.tables AS t 
WHERE EXISTS 
(
    SELECT 1 FROM sys.columns 
    WHERE name = 'column 1' 
    AND [object_id] = t.[object_id] 
) 
AND EXISTS 
(
    SELECT 1 FROM sys.columns 
    WHERE name = 'column 2' 
    AND [object_id] = t.[object_id] 
) 
/* ... repeat for other columns ... */ 
+0

不會與'列1'或者'列2'而不是兩個是回報率表嗎? –

+0

是的,但與編寫一個能夠查找帶* ALL *個已知列名的表的查詢相比,這是一個非常快速的開始。這應該很快縮小它的範圍...... –

1

替代阿龍的回答

SELECT Table_name 
FROM 
     information_schema.columns 
WHERE 
     column_name IN ('column 1', 'column 2') 
GROUP BY Table_Name 
Having COUNT(column_name) = 2 

看到這個Data.SE query爲一個工作示例

+0

一般來說,我建議不要用'INFORMATION_SCHEMA'視圖。 http://stackoverflow.com/questions/7217886/unreliable-information-schema-schema-information-on-sql-server/7310746#7310746 –

+0

@Aaron我同意,但我喜歡儘可能多的工具在我的工具箱中儘可能。同樣在這種情況下(查看錶格和列名稱),我沒有看到令人信服的理由來折扣ANSI標準視圖 –

+0

不,它更關注一致性。如果你不能爲索引使用'INFORMATION_SCHEMA',或者甚至不能使用'INFORMATION_SCHEMA'或更多關於表或列的更豐富的信息,爲什麼將它們用於你的任務子集並且必須切換到其餘的目錄視圖? –

0

使用上面的腳本,您僅限於SQL通配,這可能非常有限。您可以使用SchemaCrawler grep使用正則表達式更有效地搜索數據庫。 SchemaCrawler還允許您使用其他功能來查找與外鍵相關的表,例如,您可以說找到包含客戶地址列的所有表以及引用這些表的表。 SchemaCrawler是一個與Microsoft SQL Server數據庫驅動程序捆綁在一起的命令行工具。

Sualeh Fatehi,SchemaCrawler