2011-04-22 64 views
1

在大多數RDBMS中,元模型是「自包含的」,這意味着我可以通過瀏覽元模型本身來找出元模型的模型。這似乎並不是SQL Server的情況。我想要做的是:SQL Server INFORMATION_SCHEMA內容

SELECT * FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'INFORMATION_SCHEMA' 

這樣,我可以發現INFORMATION_SCHEMA模式本身。

是否有任何授權/許可/登錄設置,我必須配置,以使INFORMATION_SCHEMA視圖爲「自包含」?

回答

1

不要以爲這是可能的。

INFORMATION_SCHEMA.TABLES視圖的定義是

CREATE VIEW [INFORMATION_SCHEMA].[TABLES] 
AS 
SELECT 
    DB_NAME()   AS TABLE_CATALOG, 
    s.name    AS TABLE_SCHEMA, 
    o.name    AS TABLE_NAME, 
    CASE o.type 
     WHEN 'U' THEN 'BASE TABLE' 
     WHEN 'V' THEN 'VIEW' 
    END    AS TABLE_TYPE 
FROM 
    sys.objects o LEFT JOIN sys.schemas s 
    ON s.schema_id = o.schema_id 
WHERE 
    o.type IN ('U', 'V') 

所以它就會從sys.objects其信息然而,這又包含任何關於INFORMATION_SCHEMA對象。

這些元數據可通過sys.system_objects來代替。

+0

是的,我已經看到了這個。 「sys」模式是以我期望的方式自包含的。但如果可能的話,我更喜歡使用更標準化的「information_schema」。 – 2011-04-22 10:17:00

+0

@Lukas - 我懷疑這將是可能的,因爲它不排除這些權限的理由,或者它只是不在視圖的源數據中。 – 2011-04-22 10:20:04

+0

太糟糕了...感謝您的信息! – 2011-04-22 10:30:47

-1
USE information_schema; 
SHOW TABLES; 

USE mysql; 
SHOW TABLES ; 
+0

'SHOW TABLES'是MySQL命令,不是嗎? – abatishchev 2011-04-22 10:07:19

+0

謝謝,這不是關於MySQL(它有一個自包含的'information_schema')...對於SQL Server,'USE'命令不是用於選擇模式,而是用於選擇數據庫 – 2011-04-22 10:13:52

1

您可以使用sys.all_views

select SCHEMA_NAME(schema_id), name 
from sys.all_views 
order by 1,2 
+1

謝謝。這將作爲解決方法。但我更喜歡使用'information_schema',因爲它在RDBMS中更加標準化。 – 2011-04-22 10:33:25

+0

適用於「標準化」的適當小值。不運行,或者在這裏的每個dbms上運行並且不返回任何行 - SQL Server,Oracle和PostgreSQL來命名這三個最流行的。 – 2011-04-22 11:12:40

+0

@Catcall,你的意思是'information_schema'在SQL Server上不可靠?我會很驚訝......我同意Oracle沒有它,但Postgres的確如此。那麼HSQLDB(我認爲最符合標準的),H2,MySQL(好吧,對該標準有相當寬鬆的解釋) – 2011-04-22 11:25:27