Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL Server 2005/XML存储过程-Unicode到ascii?(异常0xc00ce508)_Sql Server 2005_Tsql_Stored Procedures_Unicode - Fatal编程技术网

Sql server 2005 SQL Server 2005/XML存储过程-Unicode到ascii?(异常0xc00ce508)

Sql server 2005 SQL Server 2005/XML存储过程-Unicode到ascii?(异常0xc00ce508),sql-server-2005,tsql,stored-procedures,unicode,Sql Server 2005,Tsql,Stored Procedures,Unicode,我这里有一个MSSQLS2005存储过程,它应该将XML消息作为输入,并将其内容存储到表中。 表字段是varchars,因为我们的delphi后端应用程序无法处理unicode。 现在,传入的消息被编码为ISO-8859-1。在包含超过128个标准集的字符(在本例中为ÄÖäö,这是芬兰语的一个组成部分)之前,一切正常。这会导致DB服务器引发异常0xc00ce508。 数据库以及表和字段的默认排序规则设置为latin1,这应该与ISO-8859-1相同 使用XML子系统解析XML消息,如下所示:

我这里有一个MSSQLS2005存储过程,它应该将XML消息作为输入,并将其内容存储到表中。 表字段是varchars,因为我们的delphi后端应用程序无法处理unicode。 现在,传入的消息被编码为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进行输入,但由于这导致了古老的后端应用程序(delphi5+ODBC)出现问题,我们不得不将字段切换到varchars,此时一切都中断了


我还尝试了在开始时使用nvarchar并将其转换为varchar,但结果是一样的。

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

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


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

我将回答我自己的问题,因为我设法解决了一个更为神秘的问题

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

我不知道任何有足够权限编辑答案的人是否会看到这一点,但如果答案是正确的,我想补充一点,在不明确指定排序规则的情况下,数据库的默认排序规则将在这种情况下使用,因为它隐式地分配给每个varchar变量,而没有排序规则语句

所以


也应该这样做。

我想不起为什么,但是当我尝试为varchar变量指定排序规则时,SQL server报告了一个错误。但在我的例子中,服务器的默认值也是SQL\u Latin1\u General\u CP1\u CI\u AS,因此在这种情况下,仅此一项并没有帮助。
DECLARE @XmlDocument VARCHAR(2000) COLLATE SQL_Latin1_General_CP1_CI_AS