从sys.dm_exec_sql_text中识别SQL语句

时间:2016-05-22 18:19:33

标签: sql sql-server

我有几天前写的SQL脚本,通过使用一些DMV / DMF和.sys表(主要来自sys.dm_exec_query_stats)来查找CPU密集查询。 但是,要确定在某个时间点执行的确切SQL语句,我在SELECT语句中使用以下内容(在BOL和各种博客中找到):RemoteCertificateNameMismatch

有人可以解释为什么“s.statement_start_offset”首先除以2,然后加1吗?还有为什么LEN()语句乘以2?

我在很多博客和MSDN都看到了这些例子,但我似乎无法找到这些细节。

我还在下面列出了我的整个脚本,以便您了解更多情况。


           ,SUBSTRING(t.text,s.statement_start_offset/2 +1,
                 (CASE WHEN s.statement_end_offset = -1 
                       THEN LEN(CONVERT(NVARCHAR(MAX), t.text)) * 2 
                       ELSE s.statement_end_offset END - 
                       s.statement_start_offset)/2) AS 'TSQL-Query'

1 个答案:

答案 0 :(得分:0)

这是因为sys.dm_exec_sql_text函数返回的数据是Unicode格式。 1个字符需要2个字节。 SUBSTRING适用于字符数据类型(不是字节)。因此,我们需要将字节数除以2 + 1,以使SQL Query中第一个字符的位置位于text内。