كيف أتجنب استخدام المؤشرات في Sybase (T-SQL)؟
سؤال
تخيل المشهد، وأنت تقوم بتحديث بعض التعليمات البرمجية القديمة لـ 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