INSERT XML в базу данных SQL Server 2008
Здравствуйте, я пытаюсь вставить некоторые данные XML в таблицу на SQL Server 2008. Тем не менее, я все время получаю эту ошибку:
Разбор XML: строка 1, символ 39, неспособная переключить кодировку
В столбце filemeta базы данных используется тип данных XML, и я переключил кодировку на UTF-16, которая, я считаю, необходима для добавления данных XML.
INSERT INTO testfiles
(filename, filemeta)
VALUES
('test.mp3', '<?xml version="1.0" encoding="utf-16" standalone="yes"?><!--This is a test XML file--><filemeta filetype="Audio"><Comments /><AlbumTitle /><TrackNumber /><ArtistName /><Year /><Genre /><TrackTitle /></filemeta>');
Помогите, я застрял.
NB: Я создал XML с XMLTextWriter.
Ответы
Ответ 1
Да, есть проблемы при попытке вставить XML в SQL Server 2008, а XML содержит строку команд кодирования.
Я обычно обходится с помощью функции CONVERT
, которая позволяет мне пропустить SQL Server пропустить эти инструкции - используйте что-то вроде этого:
INSERT INTO testfiles
(filename, filemeta)
VALUES
('test.mp3', CONVERT(XML, N'<?xml version="1.0" encoding="utf-16" standalone="yes"?>......', 2));
Это определенно помогло мне получить различные кодированные материалы XML в SQL Server.
Смотрите документы MSDN на CAST и CONVERT - немного вниз на странице есть несколько стилей, которые вы можете использовать для CONVERT
с XML
и некоторые пояснения о них.
Ответ 2
Вам просто нужно включить N перед вашей строкой XML, чтобы сделать его unicode.
INSERT INTO testfiles
(filename, filemeta)
VALUES
('test.mp3', N'<?xml version="1.0" encoding="utf-16" standalone="yes"?><!--This is a test XML file--><filemeta filetype="Audio"><Comments /><AlbumTitle /><TrackNumber /><ArtistName /><Year /><Genre /><TrackTitle /></filemeta>');
Ответ 3
Это работало для меня без ошибок:
DECLARE @input XML = '<?xml version="1.0" encoding="utf-16" standalone="yes"?><!--This is a test XML file--><filemeta filetype="Audio"><Comments /><AlbumTitle /><TrackNumber /><ArtistName /><Year /><Genre /><TrackTitle /></filemeta>'
INSERT INTO testfiles(filename, filemeta)
VALUES ('test.mp3',@input);