SQL Server 2005 / XML Stored Proc - Unicode для ascii? (Исключение 0xc00ce508) - PullRequest
0 голосов
/ 23 сентября 2008

У меня есть хранимая процедура MSSQL2005, которая должна принимать сообщение XML в качестве входных данных и сохранять его содержимое в таблице. Поля таблицы - это varchars, потому что наше серверное приложение delphi не может обрабатывать юникод. Теперь сообщения, которые приходят, кодируются ISO-8859-1. Все в порядке, пока не будут включены символы, превышающие стандартный набор> 128 (в данном случае, ÄÖäö, которые являются неотъемлемой частью финского языка). Это заставляет сервер БД вызывать исключение 0xc00ce508. По умолчанию для базы данных, а также для сопоставления таблицы и поля задано значение latin1, которое должно совпадать с ISO-8859-1.

Сообщение XML анализируется с использованием подсистемы XML, например:

ALTER PROCEDURE [dbo].[parse] @XmlIn NVARCHAR(1000) AS
SET NOCOUNT ON
DECLARE @XmlDocumentHandle INT
DECLARE @XmlDocument VARCHAR(1000)
BEGIN
SET @XmlDocument = @XmlIn
EXECUTE sp_xml_preparedocument @XmlDocumentHandle OUTPUT, @XmlDocument
BEGIN TRANSACTION
//the xml message's fields are looped through here, and rows added or modified in two tables accordingly
// like ...
DECLARE TempCursor CURSOR FOR
SELECT AM_WORK_ID,CUSTNO,STYPE,REFE,VIN_NUMBER,REG_NO,VEHICLE_CONNO,READY_FOR_INVOICE,IS_SP,SMANID,INVOICENO,SUB_STATUS,TOTAL,TOTAL0,VAT,WRKORDNO
FROM OPENXML (@XmlDocumentHandle, '/ORDER_NEW_CP_REQ/ORDER_NEW_CUSTOMER_REQ',8)
WITH (AM_WORK_ID int '@EXIDNO',CUSTNO int '@CUSTNO',STYPE VARCHAR(1) '@STYPE',REFE VARCHAR(50) '@REFE',VIN_NUMBER VARCHAR(30) '@VEHICLE_VINNO',
REG_NO VARCHAR(20) '@VEHICLE_LICNO',VEHICLE_CONNO VARCHAR(30) '@VEHICLE_CONNO',READY_FOR_INVOICE INT '@READY_FOR_INVOICE',IS_SP INT '@IS_SP',
SMANID INT '@SMANID',INVOICENO INT '@INVOICENO',SUB_STATUS VARCHAR(1) '@SUB_STATUS',TOTAL NUMERIC(12,2) '@TOTAL',TOTAL0 NUMERIC(12,2) '@TOTAL0',VAT NUMERIC(12,2) '@VAT',WRKORDNO INT '@WRKORDNO')
OPEN TempCursor
FETCH NEXT FROM TempCursor
INTO @wAmWork,@wCustNo,@wType,@wRefe,@wVIN,@wReg,@wConNo,@wRdy,@wIsSp,@wSMan,@wInvoNo,@wSubStatus,@wTot,@wTot0,@wVat,@wWrkOrdNo
// ... etc
COMMIT TRANSACTION
EXECUTE sp_xml_removedocument @XmlDocumentHandle
END

Раньше хранимая процедура использовала nvarchar для ввода, но поскольку это вызывало проблемы с древним бэкенд-приложением (Delphi 5 + ODBC), нам пришлось переключать поля на varchars, после чего все ломалось.

Я также пытался взять nvarchar и преобразовать его в varchar в начале, но результат тот же.

Ответы [ 3 ]

1 голос
/ 23 сентября 2008

Я отвечу на свой вопрос, так как мне удалось решить более чем загадочную проблему ...

1) Хранимая процедура должна отражать правильную кодовую страницу для преобразования:

@XmlIn NVARCHAR(2000)
@XmlDocument VARCHAR(2000)
SELECT @XmlDocument = @XmlIn COLLATE SQL_Latin1_General_CP1_CI_AS

2) В XML-входе должна быть указана та же кодировка:

<?xml version="1.0" encoding="ISO-8859-1" ?>
1 голос
/ 26 сентября 2008

Я не знаю, увидит ли это кто-нибудь с достаточными правами на редактирование ответа, но, хотя ответ верен, я хотел бы добавить, что без явного указания параметров сортировки в этом случае будет использоваться стандартное сравнение базы данных, поскольку он неявно присваивается каждой переменной varchar без оператора сортировки.

Так

DECLARE @XmlDocument VARCHAR(2000) COLLATE SQL_Latin1_General_CP1_CI_AS

тоже надо делать.

0 голосов
/ 23 сентября 2008

Кажется, код ошибки, который вы упоминаете, взят из библиотеки MSXML. Как это там связано? Из вашего вопроса я бы предположил, что вы передаете параметр varchar в хранимую процедуру, а затем вставляете или обновляете столбец varchar с этим параметром.

Однако это не соответствует вашему коду исключения, поэтому это должно происходить вне фактической хранимой процедуры, или вы выполняете дополнительные действия на основе xml внутри хранимой процедуры.

Пожалуйста, проверьте это и измените свой вопрос соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...