13

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

結果:

長さ (@userCode) = 8

長さ (@temp_userCode) = 50

変数の長さが 50 に戻ってくるのはなぜ@temp_userCodeですか? また、正しく格納するために元の長さに戻すにはどうすればよいですか?

さらに詳しい情報:

SQL Server 2005 を実行していますが、ソリューションは 2005 以降のすべてのバージョンで動作する必要があります。

4

4 に答える 4

8

に割り当てられると、長さが 128 バイトになるまでCONTEXT_INFOnull バイトが埋め込まれます。0x000x5465737455736572000000...

使用できます

REPLACE(CAST(CONTEXT_INFO() AS varchar(128)) COLLATE Latin1_General_100_BIN , 
        0x00, 
        '')
于 2012-02-24T16:56:12.793 に答える
4

で埋められCHAR(0)ます。試す:

set @temp_userCode = REPLACE(@temp_userCode COLLATE Latin1_General_BIN, CHAR(0), '');

編集:明示的なCOLLATE節を追加しましたが、今ではマーティンから盗んでいるように感じます。)

于 2012-02-24T17:02:30.220 に答える
2

これを試してください。SQL Server 2005 で動作します。

select cast(substring(CONTEXT_INFO(), 1, charindex(0x00, CONTEXT_INFO())-1) as varchar(128));

考慮すべき厄介な照合はありません:-)

于 2014-09-26T11:03:01.117 に答える