سؤال

لدي MSSQL2005 الإجراء المخزن هنا ، والتي من المفترض أن تأخذ XML رسالة الإدخال ثم تخزين المحتوى في الجدول.الجدول الحقول varchars لأن دلفي تطبيق الخلفية لا يمكن التعامل مع يونيكود.الآن على الرسائل التي تأتي في الترميز ISO-8859-1.كل شيء على ما يرام حتى الشخصيات على > 128 مجموعة قياسية تدرج (في هذه الحالة ، ÄÖäö ، والتي هي جزء لا يتجزأ من الفنلندية).وهذا يسبب DB server لرفع استثناء 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 الإدخال ، ولكن منذ أن تسبب مشاكل مع القديمة تطبيق الخلفية (دلفي 5 + ODBC) ، كان علينا أن التبديل الحقول varchars ، وهي النقطة التي حطم كل شيء.

كما أنني حاولت أخذ في nvarchar وتحويل ذلك إلى 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 الإدخال يجب تحديد نفس charset:

<?xml version="1.0" encoding="ISO-8859-1" ?>

فإن رمز الخطأ أذكر لكم يبدو أن تأتي من MSXML المكتبة.كيف تشارك هناك ؟ من سؤالك أود أن نفترض أن كنت تمر varchar المعلمة إلى الإجراء المخزن ثم إدراج أو تحديث varchar عمود مع المعلمة.

ومع ذلك هذا لا يتطابق مع رمز الاستثناء لذلك يجب أن يحدث خارج الفعلية الإجراء المخزن أو كنت تفعل أشياء إضافية على أساس xml داخل الإجراء المخزن.

يرجى التحقق من أن وتعديل السؤال الخاص بك وفقا لذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top