将CONTEXT_INFO转换为varchar以及生成的长度

Bre*_*tin 11 sql-server varchar sql-server-2005 varbinary context-info

我正在尝试将用户CONTEXT_INFO代码从存储过程传递到DELETE触发器以进行表审计.

一切正常,但是我注意到审计表中保存的用户代码的长度不正确.

以此脚本为例......

declare @userCode varchar(50)
set @userCode = 'TestUser'

declare @binary_userCode varbinary(128)
set @binary_userCode = cast(@userCode as varbinary(128))
set CONTEXT_INFO @binary_userCode

declare @temp_userCode varchar(50)
set @temp_userCode = (select cast(CONTEXT_INFO() as varchar(50)))

--set @temp_userCode = rtrim(ltrim(@temp_userCode))

select @userCode, len(@userCode), @temp_userCode, len(@temp_userCode)

set CONTEXT_INFO 0x
Run Code Online (Sandbox Code Playgroud)

结果:

len(@userCode)= 8

len(@temp_userCode)= 50

为什么@temp_userCode变量的长度为50,如何将其修剪回原始长度以正确存储?

更多的信息:

运行SQL Server 2005,但该解决方案需要在2005年以后的所有版本中运行.

Mar*_*ith 7

当分配给CONTEXT_INFO它时,用空字节填充0x00为128字节长度并变为0x5465737455736572000000...

您可以使用

REPLACE(CAST(CONTEXT_INFO() AS varchar(128)) COLLATE Latin1_General_100_BIN , 
        0x00, 
        '')
Run Code Online (Sandbox Code Playgroud)