2017-09-01 45 views
2

下面的SQL似乎正在工作,但我想知道是否有更好的方式來寫這個。我試圖選擇具有特定名稱的所有視圖和表格。如果找到匹配,則只應該有一個返回值。SQL Server:從sys.tables和sys.views中選擇

SELECT DISTINCT name 
FROM sys.tables 
WHERE name = 'MyName' 

UNION ALL 

SELECT DISTINCT name 
FROM sys.views 
WHERE name = 'MyName' 
+0

目前您的查詢有什麼問題嗎?性能?只是詢問? – Eli

+0

不。我只是在磨練我的SQL技能,並且對是否有更好的方法感到好奇 –

+1

對象可以在不同的模式中具有相同的名稱。通常,我們希望返回兩者,所以我建議你在結果中需要模式名稱。 –

回答

1

還有另一種看法可以幫助你 - 它是一個包含表和視圖的單一視圖。性能方面,我的單表查詢性能更好,但您只會注意到具有大量表的數據庫。 我爲此修改了您的查詢。

SELECT 
    DISTINCT NAME 
FROM SYS.OBJECTS 
WHERE TYPE IN ('U','V') 
AND NAME= 'MYNAME' 

U =用戶表
V =查看

+2

與原始查詢不完全相同的語義。如果他們有一個名爲'dbo.MYNAME'的表和一個名爲'dbp.MYNAME'的視圖 –

0

有INFORMATION_SCHEMA在SQL Server露出。請注意,在這裏採用TABLE_NAME會忽略表格的模式。

More DMVs here

那麼,看看這些動態管理視圖(DMV)分開第一。

SELECT * FROM INFORMATION_SCHEMA.TABLES 

SELECT * FROM INFORMATION_SCHEMA.VIEWS 

您可以使用

SELECT 
    distinct TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME = 'MyName' 

UNION ALL 

SELECT 
    distinct TABLE_NAME 
FROM INFORMATION_SCHEMA.VIEWS 
WHERE TABLE_NAME= 'MyName' 
0

如果你有一個表,並使用相同的名稱,但不同的架構視圖,你還是會回到兩行的結果集 - 這不符合您的要求。相反,只需使用「聯盟」並將其與個別查詢區分開來。

SELECT 
    name 
FROM sys.tables 
WHERE name = 'MyName' 

UNION 

SELECT 
    name 
FROM sys.views 
WHERE name= 'MyName' 
0

而是做一個DISTINCT,我寧願看到滿足過濾條件的所有東西。添加更多列可以讓您真正識別正在返回的數據。

SELECT 
    o.object_id, 
    ObjectName = CONCAT(s.name, ',', o.name), 
    ObjectType = o.type_desc 
FROM 
    sys.objects o 
    JOIN sys.schemas s 
     ON o.schema_id = s.schema_id 
WHERE 
    o.type IN ('U', 'V') 
    AND o.name = 'MyName';