про openxml

Alexander63
Дата: 11.02.2010 22:45:34
Доброй ночи господа
Имеем сервер MS SQL 2000
при попытке выполнить код
declare @Doc varchar(8000)
declare @iDoc int
set @Doc = '<?xml version="1.0" encoding="UTF-8"?>
<seans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sql="urn:schemas-microsoft-com:mapping-schema" 
xsi:noNamespaceSchemaLocation="ekb.xsd" 
org_id="245" ogrn="1234567890123" seans_title="Фантомас" pu_number="987654321" showroom="зал 1" seans_date="20091127 12:00">
<form place_x="1" place_y="1" price="200" discount="0" ticket_type="Основной" sale_date="20091127 11:59"/>
<form place_x="1" place_y="2" price="200" discount="0" ticket_type="Основной" sale_date="20091127 11:59"/>
<form place_x="1" place_y="3" price="200" discount="0" ticket_type="Основной" sale_date="20091127 11:59"/>
<form place_x="1" place_y="4" price="200" discount="0" ticket_type="Основной" sale_date="20091127 11:59"/>
<form place_x="1" place_y="6" price="200" discount="0" ticket_type="Основной" sale_date="20091127 11:59"/>
<form place_x="1" place_y="7" price="200" discount="0" ticket_type="Основной" sale_date="20091127 11:59"/>
</seans>
'
EXEC sp_xml_preparedocument @iDoc OUTPUT, @Doc
select * from OPENXML (@iDoc, '/seans') WITH
(
org_id int '@org_id',
ogrn char(13) '@ogrn',
seans_title varchar(255) '@seans_title',
pu_number varchar(20) '@pu_number',
showroom varchar(255) '@showroom',
seans_date char(14) '@seans_date'
)
EXEC sp_xml_removedocument @idoc
GO

получаю сообщение
Server: Msg 6603, Level 16, State 1, Procedure sp_xml_preparedocument, Line 13
XML parsing error: An invalid character was found in text content.

понимаю, что где-то вкрался недопустимый символ, но где не могу найти?
Mnior
Дата: 12.02.2010 00:36:53
Строковые переменные/данные (в отличие от простых стримов и файлов) имеют кодировку, указание xml кодировки в данном случае бессмыслено:
Этот текст красного цвета.

Сиквел не умеет работать с UTF-8.
Почитайте на досуге, про COLLATION и что есть у базы by Default.

К несчастью (IMXO) sp_xml_preparedocument реагирует именно на это независимо от COLLATION текущей базы (если не изменяет память), что создаёт огромную кучу недоразумений и неудобств. В вашем случае повезло, т.к. ошибка на поверхности. А вот когда неверная кодировка "хавается", тогда начинаю жаловаться - А чё корявки получаются.

С NVarChar и NText проблем поменьше т.к. строго UCS-2.
Alexander63
Дата: 12.02.2010 09:54:32
Спасибо.
Будем курть COLLATION и NTEXT
Alexander63
Дата: 12.02.2010 16:32:13
Все оказалось проще.
Если кодировка XML файла не совпадает с объявленой в заголовке, то происходит ошибка.
А если совпадает(т.е. файл в кодировке UTF-8), то файл обрабатывается нормально.
Glory
Дата: 12.02.2010 17:13:00
Alexander63
Все оказалось проще.
Если кодировка XML файла не совпадает с объявленой в заголовке, то происходит ошибка.
А если совпадает(т.е. файл в кодировке UTF-8), то файл обрабатывается нормально.

А откуда вдруг файл взялся ? В скрипте переменные ведь
Mnior
Дата: 12.02.2010 19:33:49
Alexander63
Все оказалось проще.
Не проще, а ещё хуже.
Проще, это когда вы забудете про кодировку вааще.
Но старое де..мо всё ещё долго будет портить нам нервы.

Вполне может быть, например если не происходит проверки на разницу кодировок в принимаемых данных. Но это стандартный баг, криворуких прогеров.
Можно например создать переменную строкового типа, а загнать поверх нативный float. Не каждый компилятор руганётся.