如果数据每 3 个字节都像这样拆分,是否可以将其改编为必须寻找 3 个字节或 (0x000000) 的自由序列并用新序列替换它的更新查询?问题是强制转换/替换不会处理未定义的数据,即 0x00。varbinary数据每3bytes划分->data(3bytes long)data(3bytes long)。
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
我试过的:
UPDATE x
set x.column = CAST(REPLACE(x.column, 0x000000, 0xFFFFFF) AS VARBINARY)
from Table as x
仅当列不包含数据时才有效。
UPDATE x
set x.attr = CAST(REPLACE(0x000000, 0x000000, 0xFFFFFF)
from Table as x
这个 semi 通过替换数据的前 3 个字节来工作,但我不想在此过程中丢失数据。
目标是用我想要的序列替换 varbinary(50) 中的空数据序列。或者选择二进制文件的特定位置,例如最后一个可能的三元组位置,然后将数据导入/替换为所需的序列。
为此,您可以按顺序遍历每个可能的子字符串,直到找到匹配项。然后使用拼凑新的二进制值
SUBSTRING
。我使用了一个
Nums
函数来生成正确数量的行。此函数有许多不同版本,请参阅https://sqlperformance.com/2021/01/t-sql-queries/number-series-solutions-1您还可以使用实际数字表,并在您可以使用 SQL Server 2022GENERATE_SERIES
如果该列声明为
varbinary(max)
那么您可以使用鲜为人知的.WRITE
语法来执行此操作。数据库<>小提琴
请注意,每行、每条语句只能执行一次
UPDATE
,不能执行多次替换。当我阅读这个问题时,您想将最左边出现的三个零字节替换为
0xFFFFFF
:db<>fiddle在线演示