SQL Server中的右修剪二进制数据

SQL Server中的右修剪二进制数据,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,场景: 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 f

场景:

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
我将一个字符串插入到一个二进制字段(CONTEXT_INFO)中,然后尝试将其取出并转换回字符串。当我这样做时,结果字符串的长度为128,因为它后面有空字符

示例:

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
问题:

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

当我将二进制字段转换为字符串时,如何修剪尾随的空字符?

试试这个,
在Sql Server 2008上工作。
如下所示

请注意,我假设原始字符串中没有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),'') 

这是我的解决办法。我这样做是因为上下文信息使值看起来像什么(右边的pad)


对于记录,这将修剪尾随0x00,并将0x00留在原位,如果它们发生在数据的中间:

cast(substring(CONTEXT_INFO(), 1, len(REPLACE(REPLACE(CONTEXT_INFO(), 0x20, 0x21), 0x00, 0x20))) as varbinary(128))
这将以varbinary形式给出结果,如果需要字符串,请删除外部强制转换


大多数其他解决方案要么最终删除中间的0x00,要么将其改为0x20.

< p>从 NVARCHAR(x)转换为<代码> ValBooX(x)< /C> >返回到<代码> NVARCHAR(x)将始终往返。这里描述的核心问题是因为无论用于设置
上下文信息的varbinary源的长度如何,
选择上下文信息()
始终返回128字节

有两种变通办法

第一个解决方案:从SQL Server 2016开始,可用于设置非常优越的性能

第二种解决方法
上下文信息
可以按照
上下文信息()
的工作方式从中检索。此查询将返回与当前连接关联的
上下文信息

SELECT context_info FROM sys.dm_exec_sessions WHERE session_id = @@SPID
以下是SSMS中两种检索方法的比较:

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

注意事项:设置
上下文信息
应与通过
sys.dm_exec_sessions
(如上通过SSMS批处理分隔符
GO
)检索
上下文信息
分开一批执行。

您认为用
字符(0)替换
子字符串(@string,127,1)
更好吗
?哦,上帝,谢谢你。我一直在用右边的空值填充我的数据库。我曾经玩过播放上下文信息的游戏,但是CONVERT成功了。耶!