Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Перекодировка XML  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
Всем привет.
Кто знает почему вот на такое я получаю ошибку (если encoding = windows-1251 ошибка повторяется):
declare @l_xml xml;
declare @l_text nvarchar(max);
set @l_text = '<?xml version="1.0" encoding="utf-8"?><OBJECTS><EXT ID="123" NAME="апапа" COLOR="Идфсл" /></OBJECTS>';
set @l_xml = convert(xml, @l_text);
select nref.value('@ID[1]', 'int') as id,
	   nref.value('@NAME[1]', 'nvarchar(50)') as name,
	   nref.value('@COLOR[1]', 'nvarchar(50)') as color,
       'REP' as type 
  from @l_xml.nodes('/OBJECTS/EXT') AS R(nref)
Собственно ошибка:
Msg 9402, Level 16, State 1, Line 5
XML parsing: line 1, character 38, unable to switch the encoding


Ошибка исчезает только если encoding = utf-16, но в таком случае я вместо русских букв получаю вопросы.
Подскажите пожалуйста, что в таком случае делать.
27 июн 11, 12:03    [10880151]     Ответить | Цитировать Сообщить модератору
 Re: Перекодировка XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
declare @l_xml xml;
declare @l_text nvarchar(max);
set @l_text = N'<?xml version="1.0" encoding="utf-8"?><OBJECTS><EXT ID="123" NAME="апапа" COLOR="Идфсл" /></OBJECTS>';
set @l_xml = convert(xml, @l_text);
select nref.value('@ID[1]', 'int') as id,
	   nref.value('@NAME[1]', 'nvarchar(50)') as name,
	   nref.value('@COLOR[1]', 'nvarchar(50)') as color,
       'REP' as type 
  from @l_xml.nodes('/OBJECTS/EXT') AS R(nref)
27 июн 11, 12:13    [10880210]     Ответить | Цитировать Сообщить модератору
 Re: Перекодировка XML  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
блииин.... точно!!!!

Большое спасибо!
27 июн 11, 12:17    [10880224]     Ответить | Цитировать Сообщить модератору
 Re: Перекодировка XML  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
хм, у меня ssms корректно отображает в результатах этого примера русские буквы и с N, и без него, но в обоих случаях надо прописать utf-16, utf-8 всегда даёт ту же ошибку. почему может быть разное поведение?
27 июн 11, 12:25    [10880291]     Ответить | Цитировать Сообщить модератору
 Re: Перекодировка XML  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
Shakill,
Может ли это от версии сервера зависеть?
В мое случае:
Parametr Value
ProductMicrosoft SQL Server Standard Edition
OSMicrosoft Windows NT 5.2 (3790)
PlatformNT INTEL X86
Version9.00.3042.00
LanguageEnglish (United States)
27 июн 11, 12:53    [10880515]     Ответить | Цитировать Сообщить модератору
 Re: Перекодировка XML  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Гришков Максим, версии отличаются. но документальных подтверждений пока не нашёл

Microsoft SQL Server 2008 (SP2) - 10.0.4285.0 (Intel X86)
Apr 28 2011 17:59:01
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
27 июн 11, 13:01    [10880564]     Ответить | Цитировать Сообщить модератору
 Re: Перекодировка XML  [new]
xml_xml
Guest
а у меня при utf-8 всегда та же ошибка,
а при utf-16 -- вопросы или кириллица в зависимости от наличия N:

К сообщению приложен файл. Размер - 29Kb
27 июн 11, 13:44    [10880903]     Ответить | Цитировать Сообщить модератору
 Re: Перекодировка XML  [new]
qwerty777
Member

Откуда:
Сообщений: 158
До кучи.

При utf-8 всегда та же ошибка, а при utf-16 -всегда кириллица в не зависимости от наличия N

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2425.0 (X64)   Apr  6 2011 21:03:25   Copyright (c) Microsoft Corporation  Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 

Windows 7 Prof x64
27 июн 11, 13:56    [10880968]     Ответить | Цитировать Сообщить модератору
 Re: Перекодировка XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Гришков Максим
set @l_text = '<?xml version="1.0" encoding="utf-8"?> ...';
У вас XML инвалидный.
У вас шапка тестового файла какогото фига попала в XML данные. Вы неправильно файл читаете. XML не може содержать '<?xml ...?>'.
Для совместимости с Win95 (Win 2000) и ниже сиквел может её игнорировать, если она близка к колейшину базы, или если вы используете устаревший OpenXml (2000 года, или ранее).

Эта шапка должна добавляться толь для текстового представления в системах где нет понятия кодировки строки (файлы и старые системы, аля DOS). И не должна считываться в XML поток, а учитывать кодировку при чтении (единоразово).
Согласно спецификации W3C.
27 июн 11, 18:46    [10883203]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить