2008-09-23 37 views
0

我在這裏有一個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在開始,但結果是一樣的。

回答

1

我不知道是否有人有足夠的權限來編輯答案會看到這一點,但同時答案爲c orrect我想補充一點,在沒有明確指定排序規則的情況下,在這種情況下將使用數據庫的缺省排序規則,因爲它隱式地分配給每個沒有排序規則語句的varchar變量。

所以

DECLARE @XmlDocument VARCHAR(2000) COLLATE SQL_Latin1_General_CP1_CI_AS 

應該做的伎倆了。

+0

我不記得爲什麼,但是當我試圖爲varchar變量指定排序規則時,SQL服務器報告了一個錯誤。在我的情況下,服務器的默認值是SQL_Latin1_General_CP1_CI_AS,所以在這種情況下它本身並沒有幫助。 – anon6439 2008-09-26 21:50:06

0

你提到的錯誤代碼,似乎來自於MSXML庫。那有什麼關係?從你的問題我會假設你傳遞一個varchar參數到存儲過程,然後插入或更新一個varchar列與該參數。

但是不會與你的異常代碼匹配,因此必須與實際存儲過程的外部發生,或者您是基於存儲過程中的XML做更多的事情。

請檢查並相應地修改你的問題。

+0

完成並完成,添加了一些代碼。我的錯。 – anon6439 2008-09-23 08:46:17

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" ?>