هل من الممكن في SQL Server لإنشاء وظيفة التي يمكن التعامل مع تسلسل ؟

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

سؤال

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

هل من الممكن في SQL Server لإنشاء وظيفة التي يمكن التعامل مع تسلسل ؟

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

المحلول

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

ومن سؤالك أعتقد أن هذا هو طبقة الإصرار الذي يولد تسلسل قبل إدخالها في قاعدة البيانات (بما في ذلك كيه جديد)

في MSSQL، يمكنك الجمع بين بيانات SQL مع '؛'، وذلك لاسترداد عمود هوية سجل إنشاؤها حديثا، استخدم INSERT INTO ...؛ SCOPE_IDENTITY SELECT ()

وهكذا الأمر لإدراج سجل إرجاع السجلات مع صف واحد وعمود واحد يحتوي على قيمة عمود الهوية.

ويمكنك تحويل بالطبع هذا النهج حولها، وإنشاء الجداول تسلسل (على غرار الجدول المزدوج في أوراكل)، في شيء من هذا القبيل:

INSERT INTO SequenceTable (dummy) VALUES ('X');
SELECT @ID = SCOPE_IDENTITY();
INSERT INTO RealTable (ID, datacolumns) VALUES (@ID, @data1, @data2, ...)

نصائح أخرى

أنا فعلت هذا في العام الماضي على المشروع.أساسا أنا فقط إنشاء الجدول مع اسم تسلسل القيمة الحالية, & مبلغ الزيادة.

ثم أنشأت 4 procs :

  • GetCurrentSequence( sequenceName)
  • GetNextSequence( sequenceName)
  • CreateSequence( sequenceName, startValue, incrementAmount)
  • DeleteSequence( sequenceName)

ولكن هناك قيود قد لا نقدر ؛ وظائف لا يمكن أن يكون لها آثار جانبية.لذلك يمكنك إنشاء وظيفة GetCurrentSequence(...), ولكن GetNextSequence(...) تحتاج إلى أن يكون proc, منذ كنت سوف ربما تريد أن الزيادة الحالية تسلسل القيمة.ومع ذلك ، إذا كان proc, أنك لن تكون قادرا على استخدامها مباشرة في إدخال البيانات.

وذلك بدلا من

insert into mytable(id, ....) values( GetNextSequence('MySequence'), ....);

بدلا من ذلك سوف تحتاج إلى تقسيمها على 2 خطوط ؛

declare @newID int;
exec @newID = GetNextSequence 'MySequence';
insert into mytable(id, ....) values(@newID, ....);

أيضا, SQL Server لا تملك أي آلية يمكن أن تفعل شيئا مثل

MySequence.Current

أو

MySequence.Next

نأمل شخص ما سوف تقول لي أنا غير صحيحة مع القيود المذكورة أعلاه, ولكن أنا متأكد من أنها دقيقة.

حظا سعيدا.

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

وباختصار، هذه ليست مهمة سهلة.

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