sql - إرجاع القيمة من proc المخزنة على خطأ



sql-server stored-procedures (4)

لدي sp في SQL Server الذي عند إرجاع الأخطاء -4

ماذا يعني -4؟ هل هناك جدول في مكان ما يشرح فيه قيم الإرجاع المحتملة؟

يجب أن يكون هناك بعض المعايير

فمثلا

declare @RetVal int  
EXEC @RetVal = stpTest  
select @RetVal

حيث يتم إرجاع stpTest "SELECT 1/0" -6.

-6 يجب أن تعني شيئا!

يحتوي sp الذي تم إرجاعه -4 فقط على عبارات UPDATE و SELECT INTO.

في أي وقت من الأحوال لا يفعل "SELECT -4" فكيف يمكنني "معرفة ما -4 يعني في هذا الإجراء المخزن المحدد"؟

أيضا ، إذا لم يكن هناك معيار ، فلماذا عادةً ما يعود الانقسام بفعل الخطأ صفر إلى -6؟

إذا كان لديك sp لا يعيد أي شيء ، على سبيل المثال ليس لديه أي بيانات محددة في ذلك وتقوم بذلك:

declare @RetVal int  
EXEC @RetVal = yourSPName  

ثم سيكون لـRetVal قيمة 0.

إذا كان هناك خطأ فحينئذٍ سيكونRetVal قيمة أخرى غير الصفر ، على سبيل المثال إذا كان الشيء الوحيد الذي تفعله sp هو "SELECT 1/0" ، فحينئذٍ سيكونRetVal -6.

جربها وانظر

سؤالي هو ماذا تعني قيم العودة هذه؟ يجب أن يكون لديهم بعض المعنى المنطقي!


Answer #1

فمثلا

declare @RetVal int  
EXEC @RetVal = stpTest  
select @RetVal

حيث stpTest هي SELECT 1/0 إرجاع -6.

-6 يجب أن تعني شيئا!

إذا كان لديك sp لا يعيد أي شيء ، على سبيل المثال ليس لديه أي بيانات محددة في ذلك وتقوم بذلك:

declare @RetVal int  
EXEC @RetVal = yourSPName  

ثم سيكون لـ @RetVal قيمة 0.

إذا كان هناك خطأ @RetVal سيكون @RetVal قيمة أخرى غير الصفر ، على سبيل المثال إذا كان الشيء الوحيد الذي تفعله sp هو SELECT 1/0 @RetVal سيكون @RetVal -6.

جربها وانظر

بادئ ذي بدء ، نشكرك على الإطاحة بصياغة مثال يعود -6.

إليك ما تقوله الوثائق حول -6 :

-6 حدث خطأ مستخدم متنوع.

-6 قد يكون الرمز غير متبلور الذي يرجع SQL Server.
لماذا ا؟ لأن رمز الخطأ -6 بشكل أساسي يخفي خطأ أعمق في مكدس الاستدعاءات.

بعد تحرّي هذا الخطأ بنفسي وإصلاحها ، إليك نصيحي لاستكشاف هذا الخطأ:

  1. إذا كانت طبقة DAL أو طبقة التطبيق تقوم بإنشاء هذا الخطأ ، قم بتشغيل التعليمات البرمجية لـ SQL في SQL Server Management Studio كمستخدم التطبيق ، وليس باستخدام معرّف SQL Server الخاص بك. [لماذا ا؟ لأن أذوناتك قد لا تكون هي نفسها.]
  2. اجعل كود SQL تحت الفحص مقروء قدر الإمكان. [لماذا ا؟ لأن هذا الخطأ قد يتربص داخل مكدس الاستدعاءات.]
  3. أخفق كل شيء آخر ، قم بتعليق نصف التعليمات البرمجية. هل ما زال الخطأ يحدث؟ علّق على 50٪ من الشفرة المتبقية. اشطف و كرر.

Answer #2

أعتقد أنه يجب تحرير السؤال ليطلب -

ما هي قيم الإرجاع الافتراضية إذا لم يكن لديك عبارة RETURN في proc المخزنة لديك؟

تم العثور على شيء من هذا الرابط www.redware.com/handbooks/sql_server_handbook/sql_server_stored_procedures.html

سيقوم SQL Server الافتراضي قيمة الإرجاع إلى صفر. يتم استخدام القيم التي تم إرجاعها عادةً لإرجاع إشارة حالة من الإجراء المخزن بقيمة غير صفرية تشير عادةً إلى فشل أثناء المعالجة.

من الصعب الوصول إلى القيم التي تم إرجاعها باستخدام ODBC يوصى باستخدامها فقط لإرجاع نجاح أو فشل الإجراء المخزن عند الاتصال بالإجراءات المخزنة الأخرى.

من هذا الرابط - www.redware.com/handbooks/sql_server_handbook/sql_server_stored_procedures.html

يتم الاحتفاظ قيم الإرجاع -99 خلال 0 للاستخدام الداخلي لـ SQL Server. يمكنك إنشاء المعلمات الخاصة بك والتي يمكن تمريرها مرة أخرى إلى برنامج الاستدعاء.

أيضا رابط آخر (أظن) منErland Sommarskog www.sommarskog.se/error-handling-I.html

إرجاع القيم من الإجراءات المخزنة

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

وسواء كان لهذه الأرقام السلبية أي معنى ، فمن الصعب معرفة ذلك. كانت الحالة كما هي ، أن قيم الإرجاع من -1 إلى -99 تم حجزها لقيم الإرجاع التي تم إنشاؤها من قبل النظام ، وكتب Online Online للإصدارات السابقة من SQL Server معاني للقيم من 1 إلى 14. ومع ذلك ، كتب Online Online لـ SQL 2000 صامت على أي من هذه الحجوزات ، ولا يفسر ما يعني -1 إلى -14.

مع بعض الاستثناءات العرضية ، إرجاع الإجراءات النظام المخزنة التي شحن Microsoft مع SQL Server 0 للإشارة إلى النجاح وتشير أي قيمة غير الصفر الفشل.

الحصول على معلومات الخطأ

أيضا إذا كنت بحاجة إلى العثور على ما هو الخطأ (وليس ما يعني -6) يمكنك محاولة وضع SQL الخاصة بك في محاولة صيد ، أي.

begin try

    select 1/0 as 'an error'

end try

begin catch

    select ERROR_NUMBER() as 'ERROR_NUMBER', 
           ERROR_SEVERITY() as 'ERROR_SEVERITY',
           ERROR_STATE() as 'ERROR_STATE',
           LEFT(ERROR_PROCEDURE(),50) as 'ERROR_PROCEDURE',
           ERROR_LINE() as 'ERROR_LINE' , 
           LEFT(ERROR_MESSAGE(),40) as 'ERROR_MESSAGE'    
end catch 

Answer #3

لا يوجد معيار لرموز العودة. يجب عليك معرفة ماذا يعني -4 في هذا الإجراء المخزن المحدد. في الواقع ، ليست جميع رموز الإرجاع أخطاء.

تحرير: مثال مضاد

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[RetValTest] 
AS
BEGIN
    select 1/0;
END

GO

إعدام:

DECLARE @return_value int

EXEC    @return_value = [dbo].[RetValTest]

SELECT  'Return Value' = @return_value

GO

نتيجة:

Msg 8134, Level 16, State 1, Procedure RetValTest, Line 9
Divide by zero error encountered.

هذا مع SQL Server 2008.

يقترح بعض الأبحاث أنه قد يتم ترك هذا السلوك من SQL Server 6.0. إذا كانت هذه هي الحالة ، فيمكنك أن تقرر بنفسك مدى موثوقية ذلك ، على اعتبار أنها توقفت عن توثيقها (وتوقفت عن ضمان دقتها) منذ فترة طويلة.

بلدي "البحث" ومن المقرر ، مع الشكر ، ل SQL Server MVP تيبور Karaszi . مصدر له هو كتب Online لـ SQL Server 6.5. تحت "" السيطرة على لغة التدفق "، والعودة" ، وجد

"يحتفظ SQL Server 0 للإشارة إلى إرجاع ناجح والاحتفاظ بالقيم السالبة من - من 1 إلى - 99 للإشارة إلى أسباب مختلفة للفشل. إذا لم يتم توفير قيمة الإرجاع المعرفة من قبل المستخدم ، يتم استخدام قيمة SQL Server. قيم حالة الإرجاع المعرفة من قبل المستخدم يجب أن لا تتعارض مع تلك المحجوزة بواسطة SQL Server ، يتم حاليًا استخدام القيم من 0 إلى -14.

Answer #4

لست متأكدًا من وجود طريقة لمعرفة ذلك دون مطالبة devs SQL Server. إنه مستوى أقل من برنامجك المخزّن الذي يقيّم ما ترسله وينشئ رمز الإرجاع هذا. ما لم تكن قد حصلت على RETURN-4 على وجه التحديد في التعليمات البرمجية الخاصة بك ، فإنه قادم من محلل SQL على الأرجح.





return-value