На первый взгляд это выглядит немного странно. Я уверен, что это можно решить по-другому.
Вы пытаетесь перевести base64
в varbinary
, правильно?
Хорошо, XML-подход является рекомендуемым способом достижения этого. Тем не менее, ваша проблема, кажется, находится здесь:
cast(N'''' as xml).value(''xs:base64Binary(sql:variable(Files))''
Это ваша попытка создать необходимый оператор динамически, отсюда двойные одинарные кавычки. Это будет переводить на
cast(N'' as xml).value('xs:base64Binary(sql:variable(Files))'
Проблема в следующем: sql:variable()
ожидает имя объявленной переменной в виде строкового литерала. Кроме того, value()
ожидает два аргумента: Xpath
и тип данных. Вам нужно что-то вроде этого
cast(N'' as xml).value('sql:variable("@Files")','varbinary(max)')
Возможно, вам нужен sql:column("SomeColumn")
, который позволяет использовать значение столбца.
Один пример, демонстрирующий это
--We use FOR XML to get the binary 0x1234 as base64
SELECT 0x1234 FOR XML PATH(''); --returns "EjQ="
--Now I place the corresponding base64 string in a string variable
DECLARE @base64 VARCHAR(100)='EjQ=';
--And this is, how XML is returning the binary 0x1234 from the base64-string
SELECT CAST('' AS XML).value('sql:variable("@base64")','varbinary(max)');
И это вернуло бы то же самое и выглядело бы немного проще:
SELECT CAST(@base64 AS XML).value('.','varbinary(max)');
Проверьте это для табличного подхода
Таблица @base64
является объявленной табличной переменной, просто используйте вместо нее исходную таблицу:
--Declare a table variable with one string column and insert the base64 of 0x1234
DECLARE @base64 TABLE(Files VARCHAR(100));
INSERT INTO @base64 VALUES('EjQ=');
--use the same trick as above to get the varbinary back
SELECT CAST(Files AS XML).value('.','varbinary(max)')
FROM @base64;