قبل از ایجاد Sequence در Sql Server 2012، توضیح مختصری را درباره آن میدهم.
در واقع Sequence روشی برای تولید اعداد ترتیبی با قابلیت افزایش یا کاهش عددهای دلخواه میباشد که توسط کاربر یا برنامه نویس ایجاد میشود. بنابراین Sequenceها User-Defined میباشند.
در اینجا ممکن است سئوالی پیش بیاید که اینکار توسط Identity هم قابل انجام است، اما چرا استفاده از Sequence توسط مایکروسافت پیشنهاد میشود.
بدلایل زیر استفاده از Sequence بهتر میباشد:
-
ممکن است Application شما قبل از درج رکورد، درون یک جدول نیاز به عدد منحصربفردی داشته باشد.
-
عدد تولید شده بوسیله Sequence را میتوانید بین جداول یا ستونهای مختلف یک جدول به اشتراک بگذارید.
- میتوانید روند تولید اعداد ترتیبی را Restart نمایید. به عبارت دیگر قابلیت Restart نمودن Sequence وجود دارد.
- میتوانید Sequence خود را براساس Sort یک یا چند فیلد، تنظیم نمایید.
Syntax آن به شرح ذیل میباشد:
CREATE SEQUENCE [schema_name . ] sequence_name
[ AS [ built_in_integer_type | user-defined_integer_type ] ]
[ START WITH <constant> ]
[ INCREMENT BY <constant> ]
[ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
[ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
[ CYCLE | { NO CYCLE } ]
[ { CACHE [ <constant> ] } | { NO CACHE } ]
[ ; ]
شرح Syntax :
-
در زمان ایجاد Sequence، نوع آن میبایست عددی باشد، چنانچه ،Type آن را مشخص ننمایید، SQL Server، نوع آن را bigint در نظر میگیرد.
-
Start With: بدین مفهوم میباشد، که Sequence ایجاد شده از چه عددی آغاز شود.
-
INCREMENT BY: مفهومش این است که Sequence به چه مقداری افزایش یا کاهش یابد. به عبارت دیگری عدد تولید شده براساس مقدار Increment by تولید میشود.
-
Minvalue: کمترین مقداری که Sequence میتواند ایجاد نماید.
-
Maxvalue :بیشترین مقداری که Sequence میتواند ایجاد نماید.
-
Cycle :مقداری را که برای Cycle تعیین مینماییم، بدین مفهوم است که Sequence پس از چه عددی میبایست Restart شود.
-
Cache :عددی که برای Cache در نظر میگیریم، مفهومش این است که چه تعداد از اعداد تولید شده توسط Sequence، قبل از استفاده، میتواند در Cache قرار گیرد.
در ادامه با یک مثال ساده، یک Sequence ایجاد مینماییم:
CREATE SEQUENCE [dbo].[SequenceTest]
AS [int]
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 30
CYCLE
CACHE
GO
در مثال بالا Start with برابر یک است، یعنی اولین عددی که تولید میشود، برابر یک است،INCREMENT BY برابر یک است یعنی در هر بار فراخوانی Sequence یک عدد به عدد تولید شده قبلی افزوده میشود. مقدار Minvalue برابر یک است، یعنی کمترین مقداری که Sequence میتواند تولید نماید برابر یک است. مقدار Maxvalue برابر 30 است، یعنی بیشترین مقداری که Sequence میتواند تولید نماید برابر 30 میباشد. و Cycle هم برای Sequence فوق در نظر گرفته شده است، بدین مفهوم ، که Sequence به مقدار 30 برسد، Restart شده و از مقدار یک شروع به تولید اعداد مینماید.
برای اینکه بتوانیم مقدار Sequence را بدست آوریم، کافیست از Syntax زیر استفاده نمایید:
NEXT VALUE FOR [ database_name . ] [ schema_name . ] sequence_name
[ OVER (<over_order_by_clause>) ]
به عنوان مثال داریم:
اگر Select بالا را تا 30 بار انجام دهید، برای دفعه 31 مقدار آن یک میشود، چون در زمان تعریف Cycle ،Sequence را انتخاب کرده بودیم. در غیر اینصورت برای دفعه 31 با خطا زیر مواجه میشوید.
Msg 11728, Level 16, State 1, Line 1
The sequence object 'SequenceTest' has reached its minimum or maximum value. Restart the sequence object to allow new values to be generated.
یکی از امکانات جالب Sequence این است که شما میتوانید Sequence را روی یک فیلد Sort شده تنظیم نمایید، برای روش شدن مطلب به مثال زیر توجه نمایید:
در ابتدا مطابق Script زیر جدولی را ایجاد و مقادیری را درون آن درج مینماییم:
create table Kids
( ID int,
Name varchar(50)
);
Go
insert Kids
values
(1,'Emma')
, (1,'Tabitha')
, (2,'Kendall')
, (3,'Delaney')
, (4,'Kyle')
, (5,'Jessica')
, (6,'Josh')
, (7,'Kirsten')
, (8,'Amanda')
, (9,'Jimmy')
;
سپس یک Schema به نام Sample ایجاد میکنیم:
CREATE SCHEMA Samples ;
GO
در ادامه یک Sequence به نام Test ایجاد میکنیم:
CREATE SEQUENCE Samples.Test
AS tinyint
START WITH 1
INCREMENT BY 1 ;
GO
حال Query زیر را اجرا مینماییم:
SELECT NEXT VALUE FOR Samples.Test OVER (ORDER BY Name) AS NutID, ID, Name FROM test1.Kids
WHERE Name LIKE '%e%' ;
در Query بالا روی فیلد Name به صورت صعودی عملیات Sort انجام میشود، و سپس Sequence روی آن اعمال میگردد، برای روشنتر شدن مطلب خروجی را مشاهده نمایید که تعداد رکورد آن 6 میباشد.
امیدوارم مطلب فوق مفید واقع شده باشد.