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) 中的空数据序列。或者选择二进制文件的特定位置,例如最后一个可能的三元组位置,并使用所需的序列导入/替换那里的数据。
当我阅读问题时,您想将最左边出现的三个零字节替换为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)
| 归档时间: |
|
| 查看次数: |
429 次 |
| 最近记录: |