获取长请求的全文

Evg*_*kov 5 sql-server t-sql

如何从以下请求中获取请求的全文:

SELECT t.[text]
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
Run Code Online (Sandbox Code Playgroud)

在这里,对于足够长的请求,请求文本会中断。我使用 SSMS 17 和 18 版本。

Ran*_*gen 5

这可能是由于网格结果可以返回的最大字符数65535.

在此处输入图片说明

SSMS 18.2开始,您可以更改此设置。

感谢Aaron Bertrand指出这一点。

亚伦还提到:

如果 64kb 是您达到的限制,那么在很多地方,语句文本会在很早之前以任何方式被截断(参见字面上的任何执行计划)。

sys.dm_exec_sql_text的文本数据类型是nvarchar(max),没有问题。

您可以将列转换为 XML 作为解决方法

SELECT CAST(t.[text] AS XML)
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
Run Code Online (Sandbox Code Playgroud)

或者Evgeniy Gribkov的更好方法

SELECT t.[text] 
FROM sys.dm_exec_requests AS r 
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t 
FOR XML RAW, ELEMENTS;
Run Code Online (Sandbox Code Playgroud)

这样更好:SELECT t.[text] FROM sys.dm_exec_requests AS r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t FOR XML RAW, ELEMENTS; 由于请求文本不能总是转换为 XML。特别是远程调用存储过程时无法转换查询文本:“XML解析:第13行,字符129,非法限定名字符”

或将结果保存到文件

在此处输入图片说明

感谢埃里克·达林( Erik Darling)链接了一些更相关的答案