在表中users
,我有一列username
datatype varchar(50)
。该表没有记录。我为用户名插入一条新记录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 的每个字符,从最初设置的值中截断 1 个字符CONTEXT_INFO
注意:ANSI_PADDING 已启用