2011-07-11 22 views
2

我試圖從(SQL Server 2008)數據庫中選擇各種表名和列名。數據庫相當大。有幾個數據庫坐在同一個服務器上,每個數據庫都有不同的模式等等。一旦涉及多部分標識符,我就卡住了。例如,要檢索表的列表中的下一個數據庫,這工作得很好:在多部分標識符中查找表名稱

SELECT [name] 
FROM DatabaseOne.sys.tables 
ORDER BY [name] 

然後我想獲得一定的模式下表。例如:

SELECT [name] 
FROM DatabaseOne.SchemaOne.sys.tables 
ORDER BY [name] 

但我得到的錯誤:

​​

問題的很大一部分可能在於這樣一個事實:我真的不知道架構任何東西(如果這就是他們甚至什麼)。

另外,如果我想查找表中的列名稱,比如說DatabaseOne.SchemaOne.TableOne,我該怎麼做呢?

任何幫助將不勝感激。

+0

sys是一個模式,所以沒有像yourschema.sys.tables這樣的東西(也沒有像yourschema.tables這樣的東西,至少不是內置的元數據 - 你可以自己創建這樣的表,但不會由SQL Server維護)。 sys.tables(正如JNK指出的)包含所有用戶表,而不管架構如何。 –

+0

我不知道_sys_是真的。謝謝。 – StructuredQueryLlama

回答

1

如果使用四部分名稱,SQL假設第一部分是鏈接服務器的名稱。

系統表格在sys模式中,幷包含所有其他模式(如dbo或其他)的數據。

sys.tables中有一個schema_id值,它指定每個表所在的模式。還有一個包含模式的表sys.schemas

如果你知道你的架構名稱,你可以做一個

SELECT [name] 
FROM DatabaseOne.sys.tables t 
INNER JOIN sys.schemas s 
    ON s.schema_id = t.schema_id 
WHERE s.name = 'MySchema' 
ORDER BY [name] 

您也可以通過將s.name評價的IN評估檢查多個模式。

+0

感謝您的回覆。我不得不稍微修改它才能工作。 _DatabaseOne_下的模式似乎不出現在_sys.schemas_中。但是他們在_DatabaseOne.sys.schemas_下執行。對於任何人誰可能在未來閱讀這個話題這對我有效: 'SELECT t。[name] FROM DatabaseOne.sys.tables t INNER JOIN DatabaseOne.sys.schemas s ON s.schema_id = t。 schema_id WHERE s.name ='MySchema' ORDER BY t。[name]'。 謝謝JNK。編輯:格式。 – StructuredQueryLlama

+0

@Structured - 你可能需要完全限定你的元數據表('sys.schemas'等)。如果您在另一個數據庫的上下文中執行,它將無法工作,這聽起來像是發生了什麼。 – JNK