Преобразование Varbinary в XML SQL Сервер с шаблоном даты мм / дд / гггг ЧЧ: мм - PullRequest
0 голосов
/ 11 апреля 2020

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

SELECT TOP 2 CAST('<![CDATA[' + CONVERT(NVARCHAR(MAX), Content, 101) + ']]>' AS XML)
FROM FileTable WITH (NOLOCK)
WHERE CreatedBy = <userID>
ORDER BY CreatedOn DESC

Содержимое файла выглядит примерно так:

04/10/2020|55555555|098765432109|Lorem Ipsum|44 lorem|04/10/2020 17:46|04/10/2020 18:31|22|Lorem Ipsum Text|Lorem, Ipsum|(111) 111-9999|TXT|Lorem Ipsum Text Test|Lorem Ipsum|Lorem|A1PH4NUM3|LoremIpsum|Lorem Ipsum Test, Lorem Ipsum Text|A22.2|

Некоторые файлы преобразуются нормально, а другие превращаются в блок китайских символов. Файлы, которые превращаются в китайские символы, имеют формат даты, который выглядит следующим образом: мм / дд / гг чч: мм. Я догадываюсь, что именно этот формат является причиной проблемы, поскольку я использую date_style как 101.

Можете ли вы посоветовать мне, как мне обойти эту проблему?

1 Ответ

0 голосов
/ 12 апреля 2020

Вам необходимо знать кодировку при преобразовании двоичных данных в символы / строки.

declare @filetable table
(
    id int,
    Content varbinary(max)
);

--insert unicode N'abc...
insert into @filetable(id, Content)
values(1, cast(N'abc nvarchar to binary' as varbinary(max)));

--binary (of unicode string) to unicode: convert(NVARCHAR(max)), works fine
SELECT CAST('<![CDATA[' + CONVERT(NVARCHAR(MAX), Content) + ']]>' AS XML)
FROM @filetable
where id = 1;

--insert ASCII: 'abc...
insert into @filetable(id, Content)
values(2, cast('abc varchar to binary' as varbinary(max)));

--binary of ascii to ascii:convert(VARCHAR(max)), works fine 
SELECT CAST('<![CDATA[' + CONVERT(VARCHAR(MAX), Content) + ']]>' AS XML)
FROM @filetable
where id = 2;

--but not interchangeable
SELECT CONVERT(NVARCHAR(MAX), Content) as toNvarchar, CONVERT(VARCHAR(MAX), Content) as tovarchar
FROM @filetable;


--**LATIN characters only**: in case only binary representations of ascii and/or unicode(utf16, ucs-2) strings are stored in Content..
SELECT  id,
    case when CONVERT(NVARCHAR(MAX), Content) = cast(CONVERT(NVARCHAR(MAX), Content) as varchar(max))
    then CONVERT(NVARCHAR(MAX), Content) else cast(CONVERT(VARCHAR(MAX), Content) as nvarchar(max)) 
    end  as nvarchar_string
FROM @filetable;
...