【发布时间】:2016-01-22 01:15:56
【问题描述】:
在表users 中,我有一个数据类型为varchar(50) 的列username。该表没有记录。我为用户名插入一条带有A 的新记录。以下返回我所期望的:
SELECT username, LEN(username)
FROM users
WHERE id = 1 -- returns: A, 1
到目前为止一切顺利。
现在我从另一个表上的触发器更新表用户,使用来自 CONTEXT_INFO() 的值:
set @context = cast('B' as varbinary(128))
set CONTEXT_INFO @context
update some_other_table
set x = 'y'
where id = 97
在some_other_table 的触发器中我愿意:
DECLARE @context VARCHAR(128)
SELECT
@context = CAST(CONTEXT_INFO() AS VARCHAR(128))
FROM
master.dbo.SYSPROCESSES
WHERE
SPID = @@SPID
DECLARE @user VARCHAR(50) = LEFT(@context, 50)
UPDATE users
SET username = LTRIM(RTRIM(@user))
WHERE id = 1
用户名正确设置为“B”,但现在返回 50:
SELECT
username, LEN(username)
FROM
users
WHERE
id = 1 -- returns: B, 50
在填充上下文时,解决方案是:
set @context = cast('B' + replicate(' ', 126) as varbinary(128))
但是为什么我需要这样做呢?
当我不使用空格填充 CONTEXT_INFO 时,使用它的值进行更新会导致结果长度为 50(即使我 ltrim 和 rtrim 是更新前的单个字符值)?
为什么我必须将我的CONTEXT_INFO 填充到总共 127 个字节,而不是 128 个字节?对于每个超过 127 的字符,从 CONTEXT_INFO 最初设置的值中截断 1 个字符
注意:ANSI_PADDING 已启用
【问题讨论】: