【发布时间】:2018-07-20 11:56:23
【问题描述】:
这太奇怪了!下面的代码是一个t-sql。
BEGIN
DECLARE @cinfo VARBINARY(128) = CAST('aud:83/53784862/1' AS VARBINARY(128));
DECLARE @csinfo VARCHAR(128) = CAST(CONTEXT_INFO() AS VARCHAR(128));
SET @csinfo = '<root><value>' + REPLACE(RIGHT(@cinfo, LEN(@cinfo) - 4), '/', '</value><value>') + '</value></root>';
PRINT @csinfo
SET CONTEXT_INFO @cinfo;
DECLARE @sql VARCHAR(MAX) = '
DECLARE @cinfo VARCHAR(128) = CAST(CONTEXT_INFO() AS VARCHAR(128));
DECLARE @csinfo VARCHAR(512) = ''<root><value>'' + REPLACE(RIGHT(@cinfo, LEN(@cinfo) - 4), ''/'', ''</value><value>'') + ''</value></root>'';
PRINT @csinfo
'
EXEC(@sql)
END
这是输出:
<root><value>83</value><value>53784862</value><value>1</value></root>
<root><value>83</value><value>53784862</value><value>1
为什么没有附加</value></root>!
【问题讨论】:
-
sql-server版本为2012
-
它附加了.. 只是有一些空格。在 SSMS 的右上角观察
-
同意,我在一堆 NULL 字符后得到
</value></root>。 -
一个NULL字符(
CHAR(0))和一个字符串值NULL是不同的。 -
动态 SQL 的输出与非动态运行它没有什么不同。它们都在结束标记之前加载了 NULL 字符。这并不奇怪,
CONTEXT_INFO的值以很多 0 结尾,这将转换为 NULL 字符。
标签: sql sql-server dynamic-sql context-info