É possível adaptar isso na consulta de atualização que deve buscar uma sequência livre de 3 bytes ou (0x000000) e substituí-la por uma nova sequência se os dados forem divididos assim a cada 3 bytes? O problema é que converter/substituir não funcionará com dados indefinidos que são 0x00. Os dados varbinary são divididos a cada 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
O que eu tentei:
UPDATE x
set x.column = CAST(REPLACE(x.column, 0x000000, 0xFFFFFF) AS VARBINARY)
from Table as x
Funciona apenas se a coluna não contiver dados.
UPDATE x
set x.attr = CAST(REPLACE(0x000000, 0x000000, 0xFFFFFF)
from Table as x
Este meio funciona substituindo os primeiros 3 bytes dos dados, mas prefiro não perder dados no processo.
O objetivo é substituir a sequência de dados vazios em varbinary(50) pela sequência do meu desejo. Ou selecione um local específico do binário, por exemplo, o último local plausível do trio e importe/substitua os dados ali pela sequência desejada.
Você pode fazer isso executando todas as substrings possíveis até encontrar uma correspondência. Em seguida, reúna o novo valor binário usando
SUBSTRING
.Eu usei uma
Nums
função para gerar a quantidade correta de linhas. Existem várias versões diferentes dessa função, consulte https://sqlperformance.com/2021/01/t-sql-queries/number-series-solutions-1 Você também pode utilizar uma tabela de números reais e, em SQL Server 2022 você pode usarGENERATE_SERIES
Se a coluna for declarada como , você poderá usar a sintaxe
varbinary(max)
pouco conhecida para fazer isso..WRITE
db<>violino
Observe que isso só pode ser feito uma vez por linha, por
UPDATE
instrução, você não pode fazer várias substituições.Enquanto leio a pergunta, você deseja substituir a ocorrência mais à esquerda de três bytes zero por
0xFFFFFF
:demonstração on-line db<>fiddle