سؤال

توجد في أوراكل آلية لتوليد الأرقام التسلسلية، على سبيل المثال؛

CREATE SEQUENCE supplier_seq

    MINVALUE 1
    MAXVALUE 999999999999999999999999999
    START WITH 1
    INCREMENT BY 1
    CACHE 20;

ومن ثم تنفيذ البيان

supplier_seq.nextval

لاسترداد الرقم التسلسلي التالي.

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

يحرر:أنا لا أبحث عن طرق لإنشاء مفاتيح لسجلات الجدول تلقائيًا.أحتاج إلى إنشاء قيمة فريدة يمكنني استخدامها كمعرف (منطقي) للعملية.لذلك أحتاج إلى الوظيفة الدقيقة التي توفرها Oracle.

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

المحلول

وليس هناك تطابق تام.

وأي ما يعادل هو الهوية التي يمكنك تعيينها بمثابة نوع البيانات في حين إنشاء جدول. سوف SQLSERVER تلقائيا إنشاء تشغيل عدد تباعا خلال إدراج. ويمكن الحصول على قيمة إدراج مشاركة من خلال الدعوة SCOPE_IDENTITY () أو من خلال التشاور متغير النظامالهوية (كما أشار إلى ذلك فرانس)

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

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

كيف تنفيذ تسلسل في Microsoft SQL Server <؟ / أ>

نصائح أخرى

الهوية هي الحل الأفضل والأكثر قابلية للتطوير، ولكن إذا كنت بحاجة إلى تسلسل لا يمثل int متزايدًا، مثل 00A أو 00B أو 00C أو بعض التسلسلات الخاصة، فهناك ثاني أفضل طريقة.إذا تم تنفيذه بشكل صحيح، فسيكون حجمه جيدًا، ولكن إذا تم تنفيذه بشكل سيء، فسيكون حجمه سيئًا.أتردد في التوصية به، ولكن ما تفعله هو:

  1. يجب عليك تخزين "القيمة التالية" في جدول.يمكن أن يكون الجدول عبارة عن جدول بسيط مكون من صف واحد وعمود واحد بهذه القيمة فقط.إذا كان لديك عدة تسلسلات، فيمكنها مشاركة الجدول، ولكن قد تحصل على تنافس أقل من خلال وجود جداول منفصلة لكل منها.
  2. تحتاج إلى كتابة بيان تحديث واحد من شأنه زيادة هذه القيمة بمقدار فاصل زمني واحد.يمكنك وضع التحديث في عملية مخزنة لتسهيل استخدامه ومنع تكراره في التعليمات البرمجية في أماكن مختلفة.
  3. استخدام التسلسل بشكل صحيح، بحيث يتم قياسه بشكل معقول (لا، ليس بنفس جودة الهوية :-) يتطلب شيئين:أ.يحتوي بيان التحديث على بناء جملة خاص تم إنشاؤه لهذه المشكلة بالضبط والذي سيؤدي إلى زيادة القيمة وإرجاعها في عبارة واحدة؛ب.يجب عليك جلب القيمة من التسلسل المخصص قبل بدء المعاملة وخارج نطاق المعاملة.وهذا هو أحد أسباب قياس الهوية - فهو يُرجع قيمة جديدة بغض النظر عن نطاق المعاملة لأي منها حاول إدراج، ولكن لا يتراجع عن الفشل.وهذا يعني أنه لن يتم حظره، ويعني أيضًا أنه سيكون لديك فجوات للمعاملات الفاشلة.

يختلف بناء جملة التحديث الخاص قليلاً حسب الإصدار، ولكن الجوهر هو أنك تقوم بتعيين متغير والتحديث في نفس البيان.بالنسبة لعام 2008، لدى إيتسيك بن غان هذا الحل الأنيق: http://www.sqlmag.com/Articles/ArticleID/101339/101339.html?Ad=1

تبدو طريقة المدرسة القديمة 2000 والإصدارات الأحدث كما يلي:

تحديث مجموعة جدول التسلسل @localVar = القيمة = القيمة + 5 - قم بتغيير نهاية الذيل إلى منطق الزيادة الخاص بك

سيؤدي هذا إلى زيادة القيمة التالية وإعادتها إليك.

إذا لم يكن لديك أي فجوات على الإطلاق (قاوم هذا المطلب :-) فمن الممكن تقنيًا وضع هذا التحديث أو الإجراء بجانب بقية عملية trnsaction الخاصة بك، لكنك تحصل على نتيجة متزامنة كبيرة حيث ينتظر كل إدخال حتى يتم تنفيذ الإدخال السابق.

لا أستطيع الحصول على الفضل في هذا؛لقد تعلمت كل شيء من إيتسيك.

وجعل الحقل حقل الهوية. سوف مجال الحصول على القيمة الخاصة به تلقائيا. يمكنك الحصول على قيمة إدراج مشاركة من خلال الدعوة SCOPE_IDENTITY () أو من خلال التشاور متغير النظامالهوية

ويفضل وظيفة SCOPE_IDENTITY ().

وكما قال ضهير ليست هناك اي تطابق تام. إذا حاولت بناء الإجراء الخاص بك للقيام بذلك سوف تتوقف دائما طلبك من التوسع.

وتسلسل أوراكل هي تدرجية عالية.

حسنا، أنا أعتبر قليلا إلى الوراء. إذا كنت على استعداد حقا للتركيز على التزامن، وكنت على استعداد لاتخاذ عدد العاطلين عن النظام كما هو ممكن مع سلسلة، لديك فرصة. ولكن بما انك يبدو غير مألوف وليس مع T-SQL لتبدأ، وأود أن البدء في البحث عن بعض الخيارات الأخرى عند (ترقية التطبيق أوراكل لMSSS - هو أن ما تفعلونه)

وعلى سبيل المثال، فما عليك سوى إنشاء GUID في وظيفة "nextval". ومن شأن ذلك أن نطاق واسع.

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

وأتمنى أن SQL Server كان هذه الميزة. من شأنه أن يجعل أشياء كثيرة أسهل.

وهنا هو كيف لي أن حصلت حول هذا الأمر.

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

وtblMySeqNum اثنين من الأعمدة. ID (والذي هو هوية الباحث) وInsertDate (والذي هو عمود التاريخ والوقت مع القيمة الافتراضية GetDate ()).

وعندما تحتاج إلى الصيغة الرقمية يليها الجديدة، الدعوة لsproc أن يدرج في هذا الجدول واستخدام SCOPE_IDENTITY () للحصول على الهوية التي تم إنشاؤها. تأكد من أنك لم تتجاوز الحد الأقصى في tblIdentities. إذا كان لديك ثم العودة خطأ. إذا لن يعود تسلسل رقم بك.

والآن، لإعادة وتنظيف. لديك وظيفة الذي يعمل على بانتظام حسب الحاجة يتحقق كافة الجداول المدرجة في tblIdentites (واحد فقط حاليا) لمعرفة ما إذا كانت تحتاج إلى إعادة تعيين. إذا كانوا قد تصل قيمة إعادة تعيين أو الوقت، ثم استدعاء DBCC IDENT RESEED على اسم الجدول المدرجة في الصف (tblMySeqNum في هذا المثال). وهذا أيضا هو الوقت المناسب لمسح لدينا الصفوف الإضافية التي لا تحتاج حقا في هذا الجدول.

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

وكما قلت، من شأنه أن يجعل الكثير من الأمور أسهل من هذه الميزة كان في SQL Server ولكن أنا وجدت أن هذا العمل حول وظائف جيدة إلى حد ما.

وVaccano

إذا كنت قادرا على تحديث إلى SQL Server 2012 يمكنك استخدام الكائنات SEQUENCE. حتى SQL SERVER 2012 وقد عبر عن الدعم لمتواليات.

CREATE SEQUENCE supplier_seq
    AS DECIMAL(38)
    MINVALUE 1
    MAXVALUE 999999999999999999999999999
    START WITH 1
    INCREMENT BY 1
    CACHE 20;

SELECT NEXT VALUE FOR supplier_seq
SELECT NEXT VALUE FOR supplier_seq
SELECT NEXT VALUE FOR supplier_seq
SELECT NEXT VALUE FOR supplier_seq
SELECT NEXT VALUE FOR supplier_seq

والنتائج في:

---------------------------------------
1

(1 row(s) affected)


---------------------------------------
2

(1 row(s) affected)


---------------------------------------
3

(1 row(s) affected)


---------------------------------------
4

(1 row(s) affected)


---------------------------------------
5

(1 row(s) affected)

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

والمزيد من المعلومات عن المتواليات هنا: http://msdn.microsoft.com/en -US / مكتبة / ff878091.aspx

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

select ROW_NUMBER() OVER (ORDER BY productID) as DynamicRowNumber, xxxxxx,xxxxx

والبيان OVER يستخدم ORDER BY عن المفتاح الأساسي فريدة من نوعها في حالتي ...

ويساعد هذا الأمل ... لا أكثر من الجداول المؤقتة، أو غريب ينضم !!

وليس في الواقع جوابا، ولكن يبدو أن تسلسل يأتون إلى سيكلسرفير في عام 2012.

HTTP: //www.sql-server-performance كوم / 2011 / تسلسل مزود خادم 2011 /

لا إجابة محددة ولكن بالإضافة إلى بعض الإجابات القائمة

SCOPE_IDENTITY (SQL للعمليات)

<اقتباس فقرة>   

وSCOPE_IDENTITY، IDENT_CURRENT، والهوية وظائف مماثلة   لأنها إرجاع القيم التي يتم إدراجها في أعمدة الهوية.

     

وIDENT_CURRENT لا يقتصر كتبها نطاق والدورة؛ انها تقتصر على   الجدول المحدد. IDENT_CURRENT بإرجاع قيمة ولدت ل   جدول معين في أي دورة وأي نطاق. لمزيد من المعلومات، راجع   IDENT_CURRENT (SQL للعمليات).

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

وبالضبط بسبب هذا IDENT_CURRENT لا يقتصر كتبها نطاق والدورة؛ انها تقتصر على الجدول المحدد. نحن بحاجة إلى استخدام SCOPE_IDENTITY () لأن الهوية نطاق وتعطينا رقم فريد ولدت في دورتنا، ويتم توفيرها من قبل تفرد الهوية نفسها.

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