据我了解,动态 SQL 是批处理的一部分。然而,当我列出sqlserver.sql_batch_completed
如下内容时,
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;
我看不到任何EXEC
对该调用的调用EXEC
。例如,此处的最后一行未显示在我的扩展事件日志中。
CREATE PROCEDURE [TestThis]
AS
BEGIN
SELECT 'Test';
END
GO
EXEC (N'EXEC TestThis');
这是为什么?这些是不是EXEC
不算是一批,还是我漏掉了什么?
我似乎找不到有关此事件的任何详尽文献资料,所以如果我遗漏了一些,请原谅我。
您可能做错了什么(例如在与过滤不同的数据库中执行)。但要回答这个问题:
GO
是SSMS客户端的批处理分隔符设置(它不是TSQL命令)。在您的示例中,您发送了两个批次。一个是
create proc
,另一个动态执行 proc。复制
你会看到类似这样的内容
下面是一个编辑版本,展示了关系和嵌套