我有一个MSSQL2005存储的过程里,这是应该采取一种XML消息作为投入,并将其存储的内容表。表字段varchars,因为我们的德尔福的后台应用程序不能处理unicode。现在,消息来,被编码ISO-8859-1.所有的是收到字过>128套标准包括(在这种情况下,ÄÖäö,这是一个组成部分芬兰).这导致数据库服务器,以筹集异常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

以前,所存储的过程中使用的使用限于输入,但由于这引起的问题,与古老的后端应用程序(Delphi5+ODBC),我们不得不换领域到varchars,在这一点上的一切,打破了。

我也试过把在限和转换到varchar在开始,但结果是一样的。

有帮助吗?

解决方案

我不知道如果有人有足够的权利来编辑的答案将会看到这一点,但同时答案是正确的,我想补充一点,无需指定的排序规则明确的默认排序规则的数据库将是在这种情况下使用由于它是隐含地分配到每一个varchar变量没有一个排序规则的发言。

所以

DECLARE @XmlDocument VARCHAR(2000) COLLATE SQL_Latin1_General_CP1_CI_AS

应该做的把戏,太。

其他提示

我会回答我自己的问题,因为我设法解决了不仅仅是神秘的问题......

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

您提到的错误代码似乎来自MSXML库。那是怎么涉及到的?根据您的问题,我假设您将varchar参数传递给存储过程,然后使用该参数插入或更新varchar列。

但是,这与您的异常代码不匹配,因此它必须在实际存储过程之外发生,或者您正在基于存储过程中的xml执行其他操作。

请检查并相应修改您的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top