تحتاج مساعدة في كتابة إجراء مخزن يستخدم المعاملات

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

declare @newID varchar = 099393
declare @oldID varchar = 260260
Declare @pMsg   varchar(255) 

if exists (select * from req where [email protected])
begin
    SET @pMsg = 'The department ID ' + @oldID + ' cannot be changed at this time.'
    return
end 

Begin Try
    Begin TRAN   
        update dbo.dept
        set dept_id = @newID
    where dept_id = @oldID
COMMIT TRAN
END TRY
BEGIN CATCH
  ROLLBACK TRAN
    update dbo.dept
    set dept_id = @oldID
    where dept_id = @oldID
END CATCH

select [email protected]
return 
0
جميع الإجراءات المخزنة هي بطبيعتها في المعاملات. ليست هناك حاجة لتنفيذ التراجع في التعليمات البرمجية الخاصة بك ، بقدر ما أستطيع أن أقول.
وأضاف المؤلف Matthew, مصدر
هل يمكن أن تكون من فضلك وصفًا أكثر لما هو السلوك المقصود؟
وأضاف المؤلف Matthew, مصدر
إذا كنت ترغب في تحديث المعرِّف بالقيمة الجديدة إذا كان موجودًا ، وإلقاء خطأ إذا لم يكن موجودًا؟
وأضاف المؤلف Matthew, مصدر
حسنًا .. لقد حاولت تشغيله بدون بتة المعاملة وفقط مع بيان التحديث بعد الشرطي ويبدو أنه لا يزال يتخطى التحديث والإخراج (يتأثر 0 صف)
وأضاف المؤلف RobGries, مصدر
أحتاج إلى كتابة proc المخزنة التي ستتحقق مما إذا كان oldID يتطابق مع dept_id في جدول req وإرجاع خطأ. إذا كان oldID لا يتطابق مع dept_id في جدول req ، فيجب متابعة تحديث dept_id في جدول dept بحيث يظهر قسم تم تخزينه كصف في هذا الجدول الآن يعكس dept_id الذي تم تغييره.
وأضاف المؤلف RobGries, مصدر
في الواقع على العكس ، تحديث معرف إذا كان غير موجود في جدول req ورمي خطأ إذا كان.
وأضاف المؤلف RobGries, مصدر
حسناً لقد أخذت هذا المسلك الفريد من نوع CATCH ، وما زال يبدو أنه لا يريد معالجة بيان التحديث هذا بعد الشرط. أيه أفكار؟
وأضاف المؤلف RobGries, مصدر
هذا البيان التحديث في كتلة CATCH الخاص بك لا طائل.
وأضاف المؤلف Chris Moutray, مصدر

1 إجابة

حسناً ، فمجرد محاولة صيدك الكامل لا معنى له ، وسيكون مساوياً وظيفياً لما يلي

declare @newID varchar = 099393 
declare @oldID varchar = 260260 
declare @pMsg  varchar(255)  

if exists (select * from req where [email protected]) 
begin 
    set @pMsg = 'The department ID ' + @oldID + ' cannot be changed at this time.' 
    return 
end

update dbo.dept 
set dept_id = @newID 
where dept_id = @oldID

ملحوظة؛ لقد أزلت معرف القسم الزائف الذي حددته وأعد الكلمة الرئيسية. أنت تعرف بالفعل معرف جديد فلماذا تهتم باختياره. لقد تركت تعيين @ pMsg في لأن أفترض أن هذه معلمة إخراج.

لذلك فإن السبب الوحيد لتحديث dept لعدم العمل (عندما لا يكون الرقم القديم موجودًا في جدول req) إذا كان المعرف القديم غير موجود في جدول الإدارة.

كم أنا غبي من عدم اكتشاف ذلك ، لم تقم بتعيين أطوال varchars ، بحيث يكون طول newid و oldie 1 ، وبالتالي لن يأخذ القيم المخصصة 099393 و 260260

على الأقل ينبغي أن يكون

declare @newID varchar(6) = 099393 
declare @oldID varchar(6) = 260260
0
وأضاف
شكر. هذا بدا للعمل بعد أن أصلح أنواع البيانات الخاصة بي ... D'oh! كان يتوقع شار بدلا من varchar.
وأضاف المؤلف RobGries, مصدر
في هذه الحالة ، نعم ، حاول التجريب بلا جدوى لأن هناك معاملة واحدة فقط. ومع ذلك ، إذا كنت تقوم بأكثر من إدراج/تحديث/حذف ، فيجب أن تستخدمها.
وأضاف المؤلف HLGEM, مصدر
جيد لقد لاحظت ذلك أيضا :)
وأضاف المؤلف Chris Moutray, مصدر
لم يكن هناك حاجة ، لأن تطبيقات C# الخاصة بي تدير المعاملات
وأضاف المؤلف Chris Moutray, مصدر