SQL Server:从SYS.Tables和sys.views中进行选择



以下SQL似乎在起作用,但是我想知道是否有更好的方法来编写此书。我正在尝试选择具有特定名称的所有视图和表。当找到匹配时,只有一个返回值。

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 = View

SQL Server中有信息_schema。请注意,在此处取table_name无视表的架构。

这里更多的DMV

因此,请首先单独查看这些动态管理视图(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'

而是做一个独特的事情,我宁愿看到符合过滤器标准的所有内容。添加另外几列将使您实际识别要返回的数据。

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';

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

最新更新