Varbinary 更新尝试

Pet*_*ter 5 query sql-server-2012 varbinary

如果数据像这样每 3 个字节分割,是否可以将其适应更新查询,该更新查询必须寻找 3 个字节或 (0x000000) 的空闲序列,并用新序列替换它?问题是强制转换/替换无法处理未定义的数据(即 0x00)。varbinary 数据每 3 个字节划分 -> data(3bytes 长)data(3bytes 长)。

DECLARE @YourTable table
(
Id INT PRIMARY KEY,
Val VARBINARY(50)
)

INSERT @YourTable
VALUES (1, 0x0329000414000B14000C14000D0F00177800224600467800473C00550F00000000000000000000000000),
       (2, 0x0329002637000B14000C14000D0F00177800224600467800473C00550F00000000000000000000000000);


SELECT Id, Triplet
FROM @YourTable T
JOIN (VALUES (1),(4),(7),(10),(13),(16),(19),(22),(25),(28),(31),(34),(37),(40),(43),(46),(49)) Nums(Num) ON Num <= DATALENGTH(T.Val)
CROSS APPLY (VALUES (SUBSTRING(T.Val, Num, 3))) V(Triplet)
WHERE Triplet = 0x000000 and DATALENGTH(Triplet) = 3
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

UPDATE x    
set  x.column =  CAST(REPLACE(x.column, 0x000000, 0xFFFFFF) AS VARBINARY)
from Table as x 
Run Code Online (Sandbox Code Playgroud)

仅当列不包含数据时才有效。

UPDATE x    
set  x.attr =  CAST(REPLACE(0x000000, 0x000000, 0xFFFFFF) 
from Table as x 
Run Code Online (Sandbox Code Playgroud)

这个半成品通过替换数据的前 3 个字节来工作,但我不希望在此过程中丢失数据。

目标是用我想要的序列替换 varbinary(50) 中的空数据序列。或者选择二进制文件的特定位置,例如最后一个可能的三元组位置,并使用所需的序列导入/替换那里的数据。

Pau*_*ite 2

当我阅读问题时,您想将最左边出现的三个零字节替换为0xFFFFFF

DECLARE 
    @ToFind binary(3) = 0x000000,
    @ReplaceWith binary(3) = 0xFFFFFF;

UPDATE YT
SET Val = SUBSTRING(YT.Val, 1, CI.pos - 1) + 
    @ReplaceWith + 
    SUBSTRING(YT.Val, CI.pos + 3, 2147483647)
FROM @YourTable AS YT
CROSS APPLY (VALUES(CHARINDEX(@ToFind, YT.Val))) AS CI (pos)
WHERE
    CI.pos > 0;

SELECT YT.Id, YT.Val 
FROM @YourTable AS YT
ORDER BY YT.Id;
Run Code Online (Sandbox Code Playgroud)

db<>fiddle在线演示