我有几天前写的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'
答案 0 :(得分:0)
这是因为sys.dm_exec_sql_text
函数返回的数据是Unicode格式。 1个字符需要2个字节。 SUBSTRING
适用于字符数据类型(不是字节)。因此,我们需要将字节数除以2 + 1,以使SQL Query中第一个字符的位置位于text
内。