2008-09-23 4 views
0

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.

Répondre

1

Je ne sais pas si quelqu'un disposant de droits suffisants pour modifier la réponse verra cela, mais alors que la réponse est c orrect Je voudrais ajouter que sans spécifier explicitement le classement, le classement par défaut de la base de données serait utilisé dans ce cas car il est implicitement assigné à chaque variable varchar sans une instruction de classement.

Alors

DECLARE @XmlDocument VARCHAR(2000) COLLATE SQL_Latin1_General_CP1_CI_AS 

devrait faire l'affaire aussi.

+0

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

0

Le code d'erreur que vous mentionnez semble provenir de la bibliothèque MSXML. Comment cela est-il impliqué là-bas? À partir de votre question, je suppose que vous passez un paramètre varchar à une procédure stockée, puis insérez ou mettez à jour une colonne varchar avec ce paramètre.

Toutefois, cela ne correspond pas à votre code d'exception, il doit donc se produire en dehors de la procédure stockée réelle ou vous effectuez des opérations supplémentaires basées sur xml dans la procédure stockée.

Veuillez vérifier cela et modifier votre question en conséquence.

+0

Fait et fait, ajouté du code. Ma faute. – anon6439

1

Je vais répondre à ma propre question, puisque je réussi à résoudre le problème plus cryptique ...

1) La procédure stockée doit refléter la page de code correct pour la transformation:

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

2) l'entrée XML doit spécifier le même charset:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
Questions connexes