如果数据像这样每 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 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试进行一个遍历 varbinary 数据的查询。问题是我无法真正完成我想要实现的目标。关于该列,您应该了解的是 varbinary(50) ,并且出现的模式没有特定的书写顺序,这意味着每个前缀可以是任何位置,只要它有 3 个字节(0x000000) 第一个字节是前缀,第二个和第三个是值数据我想检查它是否在我喜欢的范围内。所有的数据都是这样写的。
我尝试过的:
DECLARE @t TABLE (
val VARBINARY(MAX)
)
INSERT INTO @t SELECT 0x00000100000000000000000000000000000000000000000000000000
INSERT INTO @t SELECT 0x00001000000000000000000000000000000000000000000000000000
INSERT INTO @t SELECT 0x00010000000000000000000000000000000000000000000000000000
INSERT INTO @t SELECT 0x00100000000000000000000000000000000000000000000000000000
INSERT INTO @t SELECT 0x00000f00000000000000000000000000000000000000000000000000
declare @pattern varbinary(max)
declare @pattern2 varbinary(max)
set @pattern = 0x0001
set @pattern2 = @pattern+0xFF
select @pattern,@pattern2
SELECT
*
FROM @t
WHERE val<@pattern
OR val>@pattern2
Run Code Online (Sandbox Code Playgroud)
这是完全失败的,如果我使用 4 个符号作为图案,图案最多可以精确到 2 个符号,只有当图案位于预定义位置时,它才会起作用。我已经尝试过这个和下面所有内容的组合。
WHERE CONVERT(varbinary(2), val) = 0xdata
Run Code Online (Sandbox Code Playgroud)
还有这个:
select *
from table …
Run Code Online (Sandbox Code Playgroud)