Tenho algumas consultas que são executadas no Query Store, a exibição sys.query_store_wait_stats
não está no SQL Server 2016, mas está no SQL Server 2017. Quero que minhas consultas funcionem no SQL Server 2016 e no SQL Server 2017+.
Para fazer isso eu usei IF EXISTS
como abaixo
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;
O que parece uma boa solução, EXCETO que, o abaixo não retorna nenhum resultado no banco de dados SQL Server 2017 com o Query Store ativo
select * FROM sys.views where name = 'sys.query_store_wait_stats'
A Microsoft tem esta resposta: Como faço para encontrar todas as exibições em um banco de dados?
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;
Mas ele só retorna as visualizações do usuário, NÃO as visualizações do sistema.
Alguns testes simples também não retornam a visualização do sistema, que está presente. Você pode experimentá-los sem um WHERE
e não obter nenhuma visualização do sistema.
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'
Eu poderia testar a versão do SQL Server, mas se a exibição for adicionada ao SQL Server 2016 em um Service Pack, quero que minha consulta tenha verificado apenas a presença da exibição.
Como faço para encontrar (ou testar) a presença de uma visualização do sistema?
Não é apenas se os objetos existirem como um todo, você também precisa garantir que as colunas estejam alinhadas. A Microsoft adiciona coisas novas e, às vezes, faz backports. É bom não confiar na verificação de versão ou se preocupar com a falha se alguém não tiver reinicializado após o patch.
Como exemplo relacionado, quando
dm_exec_query_stats
obtive informações sobre derramamentos de tempdb e queria mostrar essas colunas, usei um código como este para testá-las.Você só precisa remover o nome do esquema e usar
all_views
.SQL Fiddle: http://www.sqlfiddle.com/#!18/9eecb/50897
Você pode usar o system_views em vez de all_views.
Dessa forma, você pode evitar selecionar visualizações definidas pelo usuário ao mesmo tempo.