سؤال

تخيل المشهد، وأنت تقوم بتحديث بعض التعليمات البرمجية القديمة لـ Sybase وتجد المؤشر.يقوم الإجراء المخزن بإنشاء مجموعة نتائج في جدول #temporary والذي يكون جاهزًا للإرجاع باستثناء أن أحد الأعمدة لا يمكن قراءته بشكل رهيب من قبل الإنسان، فهو رمز أبجدي رقمي.

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

declare c_lookup_codes for
select distinct lookup_code
from #workinprogress

while(1=1)
begin
    fetch c_lookup_codes into @lookup_code

    if @@sqlstatus<>0
    begin
        break
    end

    exec proc_code_xref @lookup_code @xref_code OUTPUT

    update #workinprogress
    set xref = @xref_code
    where lookup_code = @lookup_code
end

الآن، في حين أن هذا قد يسبب خفقان القلب لبعض الناس، إلا أنه يعمل.سؤالي هو: ما هي أفضل طريقة لتجنب هذا النوع من الأشياء؟

_ملاحظة:لأغراض هذا المثال، يمكنك أيضًا أن تتخيل أن مجموعة النتائج موجودة في منطقة مكونة من 500 ألف صف وأن هناك 100 قيمة مميزة لـ look_up_code وأخيرًا، أنه من غير الممكن أن يكون لديك جدول يحتوي على قيم xref كمنطق في proc_code_xref غامض جدًا._

هل كانت مفيدة؟

المحلول

يجب أن يكون لديك جدول XRef إذا كنت تريد إخراج المؤشر.بافتراض أنك تعرف 100 قيمة بحث مميزة (وأنها ثابتة)، فمن السهل إنشاء واحدة عن طريق استدعاء proc_code_xref 100 مرة وإدراج النتائج في جدول

نصائح أخرى

ما لم تكن على استعداد لتكرار التعليمات البرمجية في xref proc، فلا توجد طريقة لتجنب استخدام المؤشر.

يقولون، إذا كان يجب عليك استخدام المؤشر، فلا بد أنك فعلت شيئًا خاطئًا؛-) إليك الحل بدون المؤشر:

declare @lookup_code char(8)

select distinct lookup_code
into #lookup_codes
from #workinprogress

while 1=1
begin
    select @lookup_code = lookup_code from #lookup_codes

    if @@rowcount = 0 break

    exec proc_code_xref @lookup_code @xref_code OUTPUT

    delete #lookup_codes
    where lookup_code = @lookup_code
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top