2017-09-01 65 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';