以下SQL似乎有效,但我想知道是否有更好的方法来编写它。我试图选择具有特定名称的所有视图和表。如果找到匹配项,则应该只有一个返回值。
SELECT DISTINCT name
FROM sys.tables
WHERE name = 'MyName'
UNION ALL
SELECT DISTINCT name
FROM sys.views
WHERE name = 'MyName'
答案 0 :(得分:3)
SQL Server中有INFORMATION_SCHEMA。请注意,在这里取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'
答案 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中不允许创建具有相同名称的多个对象。