يمكنني الحفاظ على الدولة بين المكالمات إلى SQL Server UDF ؟

StackOverflow https://stackoverflow.com/questions/28280

  •  09-06-2019
  •  | 
  •  

سؤال

لدي برنامج نصي SQL إدراج البيانات (عن طريق إدراج البيانات حاليا بالآلاف) أحد الأعمدة يحتوي على معرف فريد (على الرغم من لا هوية النوع ، فقط عادي رأ' int) هذا في الواقع فريدة من نوعها عبر عدد قليل من جداول مختلفة.

أود أن أضيف العددية الدالة على السيناريو الذي يحصل المتاحة التالية معرف (أيآخر يستخدم ID + 1) ولكن أنا متأكد من أن هذا ممكن لأن هناك لا يبدو أن يكون وسيلة إلى استخدام العالمية أو متغير ثابت من داخل UDF, لا أستطيع استخدام الجدول المؤقت, و لا أستطيع تحديث جدول دائمة من خلال وظيفة.

حاليا السيناريو يبدو مثل هذا:

   declare @v_baseID int 
   exec dbo.getNextID @v_baseID out  --sproc to get the next available id
   --Lots of these - where n is a hardcoded value
   insert into tableOfStuff (someStuff, uniqueID) values ('stuff', @v_baseID + n ) 
   exec dbo.UpdateNextID @v_baseID + lastUsedn  --sproc to update the last used id

ولكن أود أن تبدو مثل هذا:

   --Lots of these
   insert into tableOfStuff (someStuff, uniqueID) values ('stuff', getNextID() ) 

Hardcoding الإزاحة هو ألم في المؤخرة, و هو خطأ عرضة.التعبئة والتغليف إلى بسيط العددية وظيفة جذابة جدا, ولكن أنا بدأت أعتقد أنه لا يمكن أن يتم بهذه الطريقة لأن هناك لا يبدو أن يكون وسيلة للحفاظ على تعويض مواجهة بين المكالمات.هل هذا صحيح أم أن هناك شيء أنا في عداد المفقودين.

نحن باستخدام SQL Server 2005 في هذه اللحظة.

التعديلات على التوضيح:

اثنين من المستخدمين ضرب هذا لن يحدث.هذا هو ترقية البرنامج النصي الذي سيتم تشغيل مرة واحدة فقط و لا في نفس الوقت.

الفعلية sproc ليست مسبوقة مع sp_ ثابتة المثال التعليمات البرمجية.

في الاستخدام العادي نستخدم معرف الجدول و sproc للحصول على معرفات حسب الحاجة ، كنت أبحث عن نظافة طريقة للقيام بذلك في هذا السيناريو ، والتي في جوهرها مجرد مقالب مجموعة من البيانات في قاعدة البيانات.

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

المحلول

أنا بدأت أعتقد أنه لا يمكن أن يتم بهذه الطريقة لأن هناك لا يبدو أن يكون وسيلة للحفاظ على تعويض مواجهة بين المكالمات.هل هذا صحيح أم أن هناك شيء أنا في عداد المفقودين.

لم تكن في عداد المفقودين أي شيء ؛ SQL Server لا يدعم المتغيرات العالمية, وأنها لا تدعم تعديل البيانات داخل UDFs.وحتى إذا كنت تريد أن تفعل شيئا kludgy باستخدام CONTEXT_INFO (انظر http://weblogs.sqlteam.com/mladenp/archive/2007/04/23/60185.aspx) لا يمكنك تعيين أنه من ضمن UDF على أي حال.

هل هناك طريقة يمكنك الحصول على حول "hardcoding" من يقابله جعل هذا متغير حلقات على التكرار ، القيام تدرج ضمن تلك الحلقة ؟

نصائح أخرى

إذا كان لديك 2 المستخدمين ضربه في الوقت نفسه أنها سوف تحصل على نفس معرف.لماذا لم تستخدم معرف الجدول مع الهوية بدلا من ذلك ، تدرج إلى أن واستخدام ذلك فريدة من نوعها (والتي هي مضمونة) id, هذا سوف تؤدي أيضا أسرع بكثير

sp_getNextID

أبدا من أي وقت مضى البادئة procs مع sp_, هذا الأداء ضمنا لأن محسن أولا بفحص سيد DB لمعرفة ما إذا كان بروك موجود هناك ومن ثم ال DB المحلية ، كما إذا مايكروسوفت تقرر إنشاء sp_getNextID في حزمة الخدمة service pack لك لن تحصل على تنفيذها

فإنه من المحتمل أن يكون العمل أكثر مما يستحق, ولكن يمكنك استخدام ثابت C#/VB المتغيرات في SQL CLR UDF, لذلك أنا أعتقد أنك سوف تكون قادرة على أن تفعل ما تريد القيام به ببساطة عن طريق تزايد هذا المتغير في كل مرة UDF يسمى.متغير ثابت سوف تضيع كلما appdomain تفريغ بالطبع.حتى إذا كنت بحاجة إلى استمرارية الهوية الخاصة بك من يوم واحد إلى التالي كنت بحاجة إلى وسيلة ، على الوصول الأول من NextId إلى استطلاع جميع الجداول التي تستخدم هذا المعرف ، للعثور على أعلى قيمة.

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