以下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中创建具有相同名称的多对象。