يمكنني الحفاظ على الدولة بين المكالمات إلى SQL Server UDF ؟
-
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 إلى استطلاع جميع الجداول التي تستخدم هذا المعرف ، للعثور على أعلى قيمة.