下面的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'
下面的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'
还有另一种看法可以帮助你 - 它是一个包含表和视图的单一视图。性能方面,我的单表查询性能更好,但您只会注意到具有大量表的数据库。 我为此修改了您的查询。
SELECT
DISTINCT NAME
FROM SYS.OBJECTS
WHERE TYPE IN ('U','V')
AND NAME= 'MYNAME'
U =用户表
V =查看
与原始查询不完全相同的语义。如果他们有一个名为'dbo.MYNAME'的表和一个名为'dbp.MYNAME'的视图 –
有INFORMATION_SCHEMA在SQL Server露出。请注意,在这里采用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'
如果你有一个表,并使用相同的名称,但不同的架构视图,你还是会回到两行的结果集 - 这不符合您的要求。相反,只需使用“联盟”并将其与个别查询区分开来。
SELECT
name
FROM sys.tables
WHERE name = 'MyName'
UNION
SELECT
name
FROM sys.views
WHERE name= 'MyName'
而是做一个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';
目前您的查询有什么问题吗?性能?只是询问? – Eli
不。我只是在磨练我的SQL技能,并且对是否有更好的方法感到好奇 –
对象可以在不同的模式中具有相同的名称。通常,我们希望返回两者,所以我建议你在结果中需要模式名称。 –