2008-09-23 100 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" ?>