返回指定 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。 |
number |
smallint |
指示组的编号(如果过程已分组)。 0 = 项不是过程。 NULL = 特殊 SQL 语句。 |
encrypted |
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 检索这些语句的句柄。
结果集的 text 列已针对可能包含密码的文本进行了筛选。 有关未被监控的安全相关存储过程的详细信息,请参阅筛选跟踪。
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)