J'ai ici une procédure stockée MSSQL2005, qui est supposée prendre un message XML en entrée, et stocker son contenu dans une table. Les champs de la table sont des varchars, car notre application dorsale delphi ne pouvait pas gérer unicode. Maintenant, les messages qui entrent sont codés ISO-8859-1. Tout va bien jusqu'à ce que les caractères sur l'ensemble standard> 128 soient inclus (dans ce cas, ÄÖöö, qui font partie intégrante de finlandais). Cela provoque le serveur de base de données à déclencher l'exception 0xc00ce508. Le classement par défaut de la base de données, ainsi que celui de la table et du champ, est défini sur latin1, qui doit être identique à ISO-8859-1.SQL Server 2005/XML stocké Proc - Unicode à ASCII? (Exception 0xc00ce508)
Le message XML est analysé à l'aide du sous-système XML, comme suit:
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
Auparavant, la procédure stockée utilisée pour utiliser nvarchar pour l'entrée, mais puisque cela a causé des problèmes avec l'application backend ancienne (Delphi 5 + ODBC), nous avons dû passer les champs à varchars, à quel point tout s'est cassé.
J'ai également essayé de prendre nvarchar et de le convertir en varchar au début, mais le résultat est le même.
Je ne me souviens pas pourquoi, mais le serveur SQL a signalé une erreur lorsque j'ai essayé de spécifier un classement pour la variable varchar. Dans mon cas, la valeur par défaut du serveur est SQL_Latin1_General_CP1_CI_AS, donc cela n'a pas aidé dans ce cas. – anon6439