如何在SQL Server扩展事件中分别跟踪游标语句?

问题描述

我想使用扩展事件将语句跟踪到SQL Server游标中,但是在Internet上找到的所有解决方案都不起作用-例如this

测试代码:

DECLARE @objectId int;

DECLARE cur CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT TOP(3) object_id
FROM sys.tables AS t
ORDER BY object_id;

OPEN cur;
FETCH NEXT FROM cur INTO @objectId;
WHILE @@FETCH_STATUS = 0
BEGIN
    BEGIN TRAN;
    SELECT @objectId AS object_id;
    WAITFOR DELAY '00:00:01';
    COMMIT;
    FETCH NEXT FROM cur INTO @objectId;
END;
CLOSE cur;
DEALLOCATE cur;

解决方法

如果您希望使用扩展事件跟踪 SQL Server 游标及其内部语句,您可以从库中选择以下事件:

  1. sqlserver.cursor_manager_* 事件
    使用它们来捕获 TSQL 光标

  2. sqlserver.cursor_* 事件
    使用它们来捕获 API 光标

在您的示例中,您使用的是 TSQL 游标。


这是一个用于捕获 TSQL Cursor 打开/关闭事件的扩展事件会话脚本示例。
它将捕获由测试代码中声明的 TSQL 游标触发的事件。

注意:我还必须捕获事件 sqlserver.sql_statement_completed,以便从游标内执行语句。 >

#include <iostream>
#include <string>

class user1 {
    
public:
    const std::string username1;
    user1(std::string Myfirstname,std::string emailaddress,std::string); //constructor

private:
    std::string email;
    std::string mobile;

};

user1::user1(std::string Myfirstname,std::string): username1(Myfirstname),email(emailaddress) {}

int main() {
    user1 firstman {"John","john1@email.com","011000000"};
    
    std::cout << "Created " << firstman.username1 << " !\n";
}

以下是测试查询的结果(在 SQL Server 2019 和 2014 上测试):

Track_tsql_cursor results

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...