下面的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'
下面的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'
還有另一種看法可以幫助你 - 它是一個包含表和視圖的單一視圖。性能方面,我的單表查詢性能更好,但您只會注意到具有大量表的數據庫。 我爲此修改了您的查詢。
SELECT
DISTINCT NAME
FROM SYS.OBJECTS
WHERE TYPE IN ('U','V')
AND NAME= 'MYNAME'
U =用戶表
V =查看
與原始查詢不完全相同的語義。如果他們有一個名爲'dbo.MYNAME'的表和一個名爲'dbp.MYNAME'的視圖 –
有INFORMATION_SCHEMA在SQL Server露出。請注意,在這裏採用TABLE_NAME會忽略表格的模式。
那麼,看看這些動態管理視圖(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'
如果你有一個表,並使用相同的名稱,但不同的架構視圖,你還是會回到兩行的結果集 - 這不符合您的要求。相反,只需使用「聯盟」並將其與個別查詢區分開來。
SELECT
name
FROM sys.tables
WHERE name = 'MyName'
UNION
SELECT
name
FROM sys.views
WHERE name= 'MyName'
而是做一個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';
目前您的查詢有什麼問題嗎?性能?只是詢問? – Eli
不。我只是在磨練我的SQL技能,並且對是否有更好的方法感到好奇 –
對象可以在不同的模式中具有相同的名稱。通常,我們希望返回兩者,所以我建議你在結果中需要模式名稱。 –