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年以后的所有版本中运行.
当分配给CONTEXT_INFO它时,用空字节填充0x00为128字节长度并变为0x5465737455736572000000...
您可以使用
REPLACE(CAST(CONTEXT_INFO() AS varchar(128)) COLLATE Latin1_General_100_BIN ,
0x00,
'')
Run Code Online (Sandbox Code Playgroud)