0

ここにMSSQL2005ストアドプロシージャがあります。これは、XMLメッセージを入力として受け取り、その内容をテーブルに格納することになっています。delphiバックエンドアプリケーションがUnicodeを処理できなかったため、テーブルフィールドはvarcharsです。現在、着信するメッセージはISO-8859-1でエンコードされています。128を超える標準セット(この場合、フィンランド語の不可欠な部分であるÄÖäö)を超える文字が含まれるまで、すべて問題ありません。これにより、DBサーバーは例外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)で問題を引き起こしたため、フィールドをvarcharに切り替える必要があり、その時点ですべてが壊れました。

また、最初にnvarcharを取り込んでvarcharに変換してみましたが、結果は同じです。

4

3 に答える 3

1

不可解な問題を解決することができたので、私は自分の質問に答えます...

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" ?>
于 2008-09-23T11:45:46.793 に答える
1

回答を編集するのに十分な権限を持つ人がこれを見るかどうかはわかりませんが、回答は正しいですが、照合を明示的に指定せずに、この場合はデータベースのデフォルトの照合が使用されることを追加したいと思います。照合ステートメントなしですべての varchar-variable に割り当てられます。

そう

DECLARE @XmlDocument VARCHAR(2000) COLLATE SQL_Latin1_General_CP1_CI_AS

もトリックを行う必要があります。

于 2008-09-26T19:21:24.073 に答える
0

あなたが言及するエラーコードは、MSXMLライブラリから来ているようです。それはそこでどのように関係していますか?あなたの質問から、varcharパラメーターをストアード・プロシージャーに渡し、次にそのパラメーターを使用してvarchar列を挿入または更新すると仮定します。

ただし、これは例外コードと一致しないため、実際のストアドプロシージャの外部で発生するか、ストアドプロシージャ内のxmlに基づいて追加の処理を実行する必要があります。

それを確認し、それに応じて質問を修正してください。

于 2008-09-23T08:28:18.733 に答える