SQL Server:来自sys.tables和sys.views的SELECT

时间:2017-09-01 17:38:21

标签: sql sql-server

以下SQL似乎有效,但我想知道是否有更好的方法来编写它。我试图选择具有特定名称的所有视图和表。如果找到匹配项,则应该只有一个返回值。

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

UNION ALL

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

5 个答案:

答案 0 :(得分:3)

SQL Server中有INFORMATION_SCHEMA。请注意,在这里取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'

答案 1 :(得分:2)

还有一个可以帮助你的视图 - 它是一个包含表格和视图的单一视图。性能方面,我的单表查询性能更好,但您只会注意到具有大量表的数据库。 我为此目的修改了您的查询。

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

U =用户表
V =查看

答案 2 :(得分:0)

如果您有一个表和一个名称相同但模式不同的视图,您将返回一个包含两行的结果集 - 这不符合您的要求。相反,只使用' Union'并从各个查询中删除不同的内容。

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

UNION 

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

答案 3 :(得分: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';

答案 4 :(得分:0)

不用担心,这里不需要使用DISTINCT关键字,因为在SQL中不允许创建具有相同名称的多个对象。