我在這裏有一個MSSQL2005存儲過程,這是應該採取XML消息作爲輸入,並存儲它的內容到一個表。 表字段是varchars,因爲我們的delphi後端應用程序無法處理unicode。 現在,進入的消息被編碼爲ISO-8859-1。一切都很好,直到超過> 128標準集的字符都包含在內(在這種情況下,芬蘭語是ÄÖäö的一部分)。這會導致DB服務器引發異常0xc00ce508。 數據庫的默認值以及表和字段的排序規則設置爲latin1,它應與ISO-8859-1相同。SQL Server 2005/XML存儲過程 - Unicode到ASCII? (例外0xc00ce508)
的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在開始,但結果是一樣的。
我不記得爲什麼,但是當我試圖爲varchar變量指定排序規則時,SQL服務器報告了一個錯誤。在我的情況下,服務器的默認值是SQL_Latin1_General_CP1_CI_AS,所以在這種情況下它本身並沒有幫助。 – anon6439 2008-09-26 21:50:06