sys.fn_get_sql (Transact-SQL)
适用范围:SQL Server
返回指定 SQL 句柄的 SQL 语句的文本。
重要
后续版本的 Microsoft SQL Server 将删除该功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 sys.dm_exec_sql_text。 有关详细信息,请参阅sys.dm_exec_sql_text(Transact-SQL)。
语法
sys.fn_get_sql ( SqlHandle )
参数
SqlHandle
句柄值。 SqlHandle 是 varbinary(64), 没有默认值。
返回的表
列名称 | 数据类型 | 描述 |
---|---|---|
dbid | smallint | 数据库 ID。 对于临时和预定义 SQL 语句,指编译这些语句时所在的数据库的 ID。 |
objectid | int | 数据库对象的 ID。 对于特殊 SQL 语句为 NULL。 |
数字 | smallint | 指示组的编号(如果过程已分组)。 0 = 项不是过程。 NULL = 特殊 SQL 语句。 |
加密 | bit | 指示对象是否已加密。 0 = 未加密 1 = 已加密 |
text | text | SQL 语句的文本。 对于已加密对象为 NULL。 |
注解
可以从sys.dm_exec_requests(Transact-SQL)动态管理视图的sql_handle列中获取有效的 SQL 句柄。
如果传递缓存中不再存在的句柄,fn_get_sql 将返回空的结果集。 如果传递的句柄无效,则批处理将停止,并返回一条错误消息。
SQL Server 数据库引擎无法缓存某些 Transact-SQL 语句,例如大容量复制语句和包含大于 8 KB 的字符串文本的语句。 不能使用 fn_get_sql 检索这些语句的句柄。
结果 集的文本 列针对可能包含密码的文本进行筛选。 有关未监视的安全相关存储过程的详细信息,请参阅 筛选跟踪。
fn_get_sql函数返回类似于 DBCC INPUTBUFFER 命令的信息。 在以下示例中,说明因不能使用 DBCC INPUTBUFFER 而使用 fn_get_sql 函数的情况:
当事件具有 255 个以上的字符时。
当必须返回存储过程的当前最高嵌套级时。 例如,有两个存储过程,分别名为 sp_1 和 sp_2。 如果 sp_1 调用 sp_2 并且在 sp_2 运行时从 sys.dm_exec_requests 动态管理视图获得句柄,则 fn_get_sql 函数将返回 sp_2 的有关信息。 此外,fn_get_sql 函数还会返回处于当前最高嵌套级的存储过程的完整文本。
权限
用户需要对该服务器具有 VIEW SERVER STATE 权限。
示例
如下面的示例所示,数据库管理员可使用 fn_get_sql 函数帮助诊断有问题的进程。 管理员确定有问题的会话 ID 之后,即可检索该会话的 SQL 句柄,用该句柄调用 fn_get_sql,然后使用开始和结束偏移量确定有问题的会话 ID 的 SQL 文本。
DECLARE @Handle varbinary(64);
SELECT @Handle = sql_handle
FROM sys.dm_exec_requests
WHERE session_id = 52 and request_id = 0;
SELECT * FROM sys.fn_get_sql(@Handle);
GO
另请参阅
DBCC INPUTBUFFER (Transact-SQL)
sys.sysprocesses (Transact-SQL)
sys.dm_exec_requests (Transact-SQL)