Pelo que entendi, o SQL dinâmico faz parte de um lote. No entanto, quando listei para sqlserver.sql_batch_completed
o seguinte
CREATE EVENT SESSION [CaptureBatch] ON SERVER
ADD EVENT sqlserver.sql_batch_completed(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.sql_text)
WHERE ([sqlserver].[database_id]>(4)))
ADD TARGET package0.event_file(SET filename=N'CaptureBatch',max_rollover_files=(0))
WITH (STARTUP_STATE=ON);
GO
ALTER EVENT SESSION [CaptureBatch] ON SERVER
STATE = START;
Não consigo ver nenhuma chamada para EXEC
essa chamada também EXEC
. Por exemplo, a linha final aqui não aparece no log do meu Evento Estendido.
CREATE PROCEDURE [TestThis]
AS
BEGIN
SELECT 'Test';
END
GO
EXEC (N'EXEC TestThis');
Por que isso? Esses tipos EXEC
não são considerados um lote ou estou esquecendo de algo?
Não consigo encontrar nenhuma documentação detalhada sobre esse evento, então me perdoe se esqueci de alguma.
Provavelmente você está fazendo algo errado (como executar em um banco de dados diferente daquele que você está filtrando). Mas para responder à pergunta:
GO
é uma configuração de separador de lote do cliente SSMS (não é um comando TSQL).No seu exemplo, você está enviando dois lotes. Um é o
create proc
e o outro executa dinamicamente o proc.Reprodução
E você verá algo assim
E aqui está uma versão editada que mostra as relações e o aninhamento