5

シナリオ:

文字列をバイナリフィールド(CONTEXT_INFO)に挿入し、後でそれを引き出して文字列に変換しようとしています。私がそうすると、結果の文字列の長さは128になります。これは、末尾にnull文字があるためです。

例:

DECLARE @string VARCHAR(128)
DECLARE @binary VARBINARY(128)

SET @string = 'abcdefg'
SET @binary = CONVERT(VARBINARY(128), @string) --0x61626364656667000000...
SET CONTEXT_INFO @binary
SET @binary = CONTEXT_INFO()

-- I would like to change the following line so it trims trailing null chars
SET @string = CONVERT(VARCHAR(128), @binary)

SELECT
    @binary AS [binary],
    DATALENGTH(@binary) AS [binary.Length], --128 as expected
    @string AS [string],
    DATALENGTH(@string) AS [string.Length] --This is 128, but I need it to be 7

質問:

バイナリフィールドを文字列に変換するときに、末尾のヌル文字をトリミングするにはどうすればよいですか?

4

4 に答える 4

6

これを試してください、works on Sql-Server 2008.ここにSQLフィドルがあります。

元の文字列からでも単純に置き換えることができるため、元の文字列にはChar(0)が含まれていないと想定していることに注意してください。

-- I would like to change the following line so it trims trailing null chars
SET @string = CONVERT(VARCHAR(128), @binary)
SET @string = REPLACE(@string, Char(0),'') 
于 2013-01-04T18:40:41.463 に答える
4

これが私の解決策でした。CONTEXT_INFO が値をどのように見せるか(右にパッド)のために、私はこのように行きました。

DECLARE @string VARCHAR(128)
DECLARE @binary VARBINARY(128)

SET @string = 'abcdefg'
SET @string = REPLICATE(CHAR(0),128-LEN(@string))+@string
SET @binary = CONVERT(VARBINARY(128), @string)
SET CONTEXT_INFO @binary
SET @binary = CONTEXT_INFO()

SET @string = CONVERT(VARCHAR(128), REPLACE(@binary,CHAR(0),''))

SELECT
    @binary AS [binary],
    DATALENGTH(@binary) AS [binary.Length],
    @string AS [string],
    DATALENGTH(@string) AS [string.Length]
于 2013-01-04T18:45:35.413 に答える
0

nvarchar(x)からへの変換は、常に正しく往復しますvarbinary(x)nvarchar(x)ここで説明するコアの問題はSELECT CONTEXT_INFO()、設定に使用された varbinary ソースの長さに関係なく、常に 128 バイトを返すために発生しますCONTEXT_INFO

2 つの回避策があります。

最初の回避策: SQL Server 2016 以降でsp_set_session_contextは、非常に優れた を設定するために使用できますsession_context

2 番目の回避策:動作するはずの方法context_infoで取得できます。このクエリは、現在の接続に関連付けられたを返します。sys.dm_exec_sessionsCONTEXT_INFO() context_info

SELECT context_info FROM sys.dm_exec_sessions WHERE session_id = @@SPID

SSMS での 2 つの取得方法の比較を次に示します。

SET CONTEXT_INFO 0x010200340056;
GO

SELECT CONTEXT_INFO(); -- 0x0012003400560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
SELECT context_info FROM sys.dm_exec_sessions WHERE session_id = @@SPID; -- 0x001200340056

SET CONTEXT_INFO 0x;
GO

SELECT CONTEXT_INFO(); -- NULL
SELECT context_info FROM sys.dm_exec_sessions WHERE session_id = @@SPID; -- 0x

警告: 設定CONTEXT_INFOは、取得とは別にバッチで実行する必要があります(上記のように、SSMS batch-separator を介してcontext_info) 。sys.dm_exec_sessionsGO

于 2016-04-28T03:25:13.433 に答える