У меня есть хранимая процедура 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 в начале, но результат тот же.