我有一些针对查询存储运行的查询,该视图sys.query_store_wait_stats
不在 SQL Server 2016 中,但在 SQL Server 2017 中。我希望我的查询在 SQL Server 2016 和 SQL Server 2017+ 中工作。
为此,我使用IF EXISTS
如下
EXEC sp_query_store_flush_db;
SELECT * INTO Admin.dbo.query_store_runtime_stats FROM sys.query_store_runtime_stats;
SELECT * INTO Admin.dbo.query_store_runtime_stats_interval FROM sys.query_store_runtime_stats_interval;
SELECT * INTO Admin.dbo.query_store_plan FROM sys.query_store_plan;
SELECT * INTO Admin.dbo.query_store_query FROM sys.query_store_query;
SELECT * INTO Admin.dbo.query_store_query_text FROM sys.query_store_query_text;
IF EXISTS(select * FROM sys.views where name = 'query_store_wait_stats') -- View not in SQL Server 2016
Begin
SELECT * INTO Admin.dbo.query_store_wait_stats FROM sys.query_store_wait_stats;
End
SELECT * INTO Admin.dbo.query_context_settings FROM sys.query_context_settings;
这似乎是一个很好的解决方案,除了,下面不会在查询存储处于活动状态的 SQL Server 2017 数据库上返回任何结果
select * FROM sys.views where name = 'sys.query_store_wait_stats'
微软给出了这样的答案:How do I find all views in a database?
USE <database_name>;
GO
SELECT name AS view_name
,SCHEMA_NAME(schema_id) AS schema_name
,OBJECTPROPERTYEX(object_id,'IsIndexed') AS IsIndexed
,OBJECTPROPERTYEX(object_id,'IsIndexable') AS IsIndexable
,create_date
,modify_date
FROM sys.views;
但它只返回用户视图,而不是系统视图。
一些简单的测试也不会返回存在的系统视图。您可以在没有 a 的情况下尝试它们,WHERE
并且不会获得任何系统视图。
select * FROM sys.views where name = 'sys.query_store_wait_stats'
SELECT *
-- DISTINCT NAME
FROM SYS.OBJECTS
WHERE TYPE IN ('U','V')
AND NAME= 'query_store_wait_stats'
我可以测试 SQL Server 版本,但如果视图被添加到 Service Pack 中的 SQL Server 2016,我希望我的查询只检查视图是否存在。
我如何找到(或测试)系统视图的存在?
这不仅仅是对象是否作为一个整体存在,您还必须确保列对齐。微软添加了新东西,有时还向后移植。最好不要依赖版本检查,或者担心如果有人在修补后没有重新启动它会失败。
作为相关示例,当
dm_exec_query_stats
获得有关 tempdb 溢出的信息并且我想显示这些列时,我使用了这样的代码来测试它们。您只需要删除架构名称并使用
all_views
.SQL 小提琴:http ://www.sqlfiddle.com/#!18/9eecb/50897
您可以使用 system_views 而不是 all_views。
这样您就可以避免同时选择用户定义的视图。