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)

Transact-SQL 语法约定

语法

  
sys.fn_get_sql ( SqlHandle )  

参数

SqlHandle
句柄值。 SqlHandlevarbinary (64) ,没有默认值。

返回的表

列名称 数据类型 说明
dbid smallint 数据库 ID。 对于临时和预定义 SQL 语句,指编译这些语句时所在的数据库的 ID。
objectid int 数据库对象的 ID。 对于特殊 SQL 语句为 NULL。
数字 smallint 指示组的编号(如果过程已分组)。

0 = 项不是过程。

NULL = 特殊 SQL 语句。
encrypted bit 指示对象是否已加密。

0 = 未加密

1 = 已加密
文本 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)