обновить Varbinary Добавление дополнительного нуля в начале, если длина нечетная - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь сохранить файл, но из-за этого дополнительного нуля файл не открывается при загрузке из базы данных.

Есть много вопросов по этому поводу, но не удалось получить ответ

Обновление поля varbinary (MAX) в SQLServer 2012 Потерянные последние 4 бита

Обновление столбца varbinary (MAX)

Может кто-нибудь помочь мне всохранение файла в качестве начальных данных в виде постскрипта в моем проекте БД

Добавление дополнительной информации для повторного выпуска.

CREATE TABLE [Thumbnail](
   [Id]        [int] IDENTITY(1,1) NOT NULL,
   [Data]      [varbinary](max) NULL
CONSTRAINT [PK_Thumbnail] PRIMARY KEY CLUSTERED 
(
[Id] ASC
) ) ON [PRIMARY]


INSERT [Thumbnail] ( Data )
SELECT * FROM OPENROWSET (BULK 'img.png', SINGLE_BLOB) AS X

, если я загружаю изображение с помощью вышеуказанного сценария, оно работает хорошо (также с нечетной длиной).Но тот же сценарий обновляется при вставке

в значения миниатюр (данных) (0x7364736466736466736), к нему добавляется дополнительный ноль, и я не могу открыть свой файл обратно, если длина нечетная.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 07 декабря 2018

Вы можете попробовать это:

Я настроил макет для имитации вашей проблемы

DECLARE @tbl TABLE(SomeValue VARCHAR(10),TheValueAsBin VARBINARY(MAX));
INSERT INTO @tbl(SomeValue) VALUES(NULL),(''),('1'),('22'),('333'),('4444');

- Этим я установил второй столбец для соответствующегоVARBINARY значения

UPDATE @tbl SET TheValueAsBin = CAST(SomeValue AS VARBINARY(MAX));

- Проверить промежуточный результат

SELECT *
      ,DATALENGTH(TheValueAsBin) AS DataLengthOfYourBinValue
FROM @tbl

/*
SomeValue   TheValueAsBin   DataLengthOfYourBinValue
NULL        NULL            NULL
            0x              0
1           0x31            1
22          0x3232          2
333         0x333333        3
4444        0x34343434      4
*/

- Теперь я обновляю значение VARBINARY с помощью CASE, используя % (по модулю) оператор для переключения между нечетными и четными числами.

UPDATE @tbl SET TheValueAsBin = TheValueAsBin + CASE WHEN DATALENGTH(TheValueAsBin)%2 = 1 THEN 0x0 ELSE 0x END

- Проверка конечного результата

SELECT *
      ,DATALENGTH(TheValueAsBin) AS DataLengthOfYourBinValue
FROM @tbl

Результат

SomeValue   TheValueAsBin   DataLengthOfYourBinValue
NULL        NULL            NULL
            0x              0
1           0x3100          2
22          0x3232          2
333         0x33333300      4
4444        0x34343434      4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...