MS SQL 2011 - рдирдИ рдЕрдиреБрдХреНрд░рдо рд╡рд╕реНрддреБ

рдПрдХ рдЕрд╡рд╕рд░ рдЬреЛ рдХрд┐ Oracle, DB2, PostgreSQL рдФрд░ рдХрдИ рдЕрдиреНрдп рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдЬрдХрд▓ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЕрдВрддрддрдГ MS SQL рд╕рд░реНрд╡рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИред рдЕрдиреБрдХреНрд░рдо рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ!

рдЕрдиреБрдХреНрд░рдо - рдкрд╣рдЪрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрдХреНрд░рдо рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ рдФрд░ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред

SQL Server 2008 рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рджреЛ рдХреЙрд▓рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдирд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдПрдХ рдСрдЯреЛ-рдЗрдиреНрдХреНрд░рд┐рдореЗрдВрдЯрд┐рдВрдЧ рд╣реЛрдЧрд╛ред

Create Table WithOutSequence1 ( EmpId int identity not null primary key ,EmpName varchar(50) not null ) Insert into WithOutSequence1 Select 'Violet' Union All Select 'Tape' Select * from WithOutSequence1 

рдЗрд╕реА рддрд░рд╣, рдПрдХ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВред
 Create Table WithOutSequence2 ( EmpId int identity not null primary key ,EmpName varchar(50) not null ) Insert into WithOutSequence2 Select 'Violet' Union All Select 'Tape' Select * from WithOutSequence2 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рднрд░рд╛ рд╣реИред рд╣рдо рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдорд╛рди рдХрд┐рд╕реА рдЕрдиреНрдп рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рд╕реАрдХреНрд╡реЗрдВрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдХреИрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
 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 } 




рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рдмрдирд╛рдПрдБ:
 IF EXISTS (SELECT * FROM sys.sequences WHERE NAME = N'GenerateNumberSequence' AND TYPE='SO') DROP Sequence GenerateNumberSequence GO SET ANSI_NULLS ON GO CREATE SEQUENCE GenerateNumberSequence START WITH 1 INCREMENT BY 1; GO 

рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рдЕрдиреБрдХреНрд░рдо рдиреЛрдб рдореЗрдВ рдЖрдк рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред



рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕реЗ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдФрд░ рднрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 Create Table WithSequence1 ( EmpId int not null primary key ,EmpName varchar(50) not null ); Insert into WithSequence1(EmpId, EmpName) VALUES (NEXT VALUE FOR GenerateNumberSequence, 'Violet'), (NEXT VALUE FOR GenerateNumberSequence, 'Tape') SELECT * FROM WithSequence1; 

рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рдирд╕ рдореЗрдВ рджреВрд╕рд░реА рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдлрд┐рд░ рд╕реЗ GenerateNumberSequence рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдВрдб-рдЯреВ-рдПрдВрдб рдирдВрдмрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
 Create Table WithSequence2 ( EmpId int not null primary key ,EmpName varchar(50) not null ); Insert into WithSequence2(EmpId, EmpName) VALUES (NEXT VALUE FOR GenerateNumberSequence, 'Violet'), (NEXT VALUE FOR GenerateNumberSequence, 'Tape') SELECT * FROM WithSequence2; 

рдЕрдиреБрдХреНрд░рдо (рдЕрдиреБрдХреНрд░рдо) рдЬреЛ рд╣рдордиреЗ рдмрдирд╛рдпрд╛ рд╣реИ рд╡рд╣ sys рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдХреНрд░рдо ред
 SELECT Name ,Object_ID ,Type ,Type_Desc ,Start_Value ,Increment ,Minimum_Value ,Maximum_Value ,Current_Value ,Is_Exhausted FROM sys.sequences 



рдпрд╣ рдЕрдиреБрдХреНрд░рдо рдкрд░ рдЙрдкрд▓рдмреНрдз рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ рдмрд╕ рдмрд╛рдж рдореЗрдВ рдЗрди рд╕реНрддрдВрднреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддрд╛рд░ рдирд╛рдореЛрдВ рдХреЛ рддрд╛рд░рд╛рдВрдХрди рдЪрд┐рд╣реНрди рд╕реЗ рдмрджрд▓реЗрдВред Is_Exerateed рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдиреБрдХреНрд░рдо рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

рдЕрдиреБрдХреНрд░рдо рдХреЛ рдПрдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдЖрдк рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ -2147483648 рд╕реЗ 2147483647 рддрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЪрд▓рд┐рдП рдмреАрдЬ рдХреЛ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп SQL рд╕рд░реНрд╡рд░ рдХреНрдпрд╛ рдХрд╣реЗрдЧрд╛, рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдЪрд▓реЛ рдмрд╛рдИрдВ рд╕реАрдорд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
 CREATE SEQUENCE GenerateNumberSequence START WITH -2147483649 --outside the range of the int datatype boundary INCREMENT BY 1; 

рджрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ 'START With' рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдорд╛рдиреНрдп рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЬреИрд╕реА рдХреА рдЙрдореНрдореАрдж рдереАред рдЕрдм рдЪрд▓реЛ рд╕рд╣реА рд╕реАрдорд╛ рддреЛрдбрд╝реЛред
 CREATE SEQUENCE GenerateNumberSequence START WITH 2147483647 --the max range of the int datatype INCREMENT BY 1; 


рд╕рд░реНрд╡рд░ рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреА рд╕реВрдЪрдирд╛ рджреЗрдЧрд╛:

рдЕрдиреБрдХреНрд░рдо рдСрдмреНрдЬреЗрдХреНрдЯ 'GenerateNumberSequence' рдХреИрд╢ рдЖрдХрд╛рд░ рдЙрдкрд▓рдмреНрдз рдорд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ; рд╢реЗрд╖ рдЕрдиреБрдХреНрд░рдо рдорд╛рдиреЛрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╢ рдЖрдХрд╛рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдФрд░ рдпрджрд┐ рд╣рдо s_ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ Is_Exerateed рдХреЙрд▓рдо рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдорд╛рди 1 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЬреЛ рд╣рдореЗрдВ рдЗрд╕ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИред



рдЗрд╕ рдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп, рд╕рд░реНрд╡рд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдЧрд╛:

рдЕрдиреБрдХреНрд░рдо рдСрдмреНрдЬреЗрдХреНрдЯ 'GenerateNumberSequence' рдЕрдкрдиреЗ рдиреНрдпреВрдирддрдо рдпрд╛ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИред рдирдП рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВред

рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬрди рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде RESTART рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
 ALTER SEQUENCE dbo.GenerateNumberSequence RESTART WITH 1; 

рдореВрд▓реНрдп рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдорд╛рдиреНрдп рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд▓рд╛, рдЕрдиреБрдХреНрд░рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рди рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЕрдЧрд▓реЗ рдирд╣реАрдВред

рдпрд╛рдиреА рдЕрдЧрд░ рд╕реЗрдЯ:
 ALTER SEQUENCE dbo.GenerateNumberSequence RESTART WITH 10; 


рдФрд░ рдлрд┐рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
 Insert into WithSequence1(EmpId, EmpName) VALUES (NEXT VALUE FOR GenerateNumberSequence, 'violet'), (NEXT VALUE FOR GenerateNumberSequence, 'tape') SELECT * FROM WithSequence1; 

рд╡рд╣ рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
 EmpId   EmpName -----   ------- 10      violet 11      tape 

рд╕реЗрдЯрдкреЙрдЗрдВрдЯ рд╕реЗ рд╕реАрдХреНрд╡реЗрдВрд╕ рд╢реБрд░реВ рд╣реБрдЖред

рдЖрдк sys рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╕реЗ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдХреНрд░рдо ред

MIN рдФрд░ MAX рдорд╛рди


рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реНрд╡реАрдХрд╛рд░реНрдп рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдиреАрдЪреЗ рдРрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
 CREATE SEQUENCE GenerateNumberSequence START WITH 1 INCREMENT BY 1 MINVALUE 10 MAXVALUE 20 

рдиреНрдпреВрдирддрдо рдорд╛рди 10 рд╣реИ, рдЕрдзрд┐рдХрддрдо 20 рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЛ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рдВрджреЗрд╢ рд╕реЗ рдкреНрд░рд╕рдиреНрди рд╣реЛрдВрдЧреЗ:

рдЕрдиреБрдХреНрд░рдо рдСрдмреНрдЬреЗрдХреНрдЯ 'GenerateNumberSequence' рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрдн рдорд╛рди рдЕрдиреБрдХреНрд░рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдХреЗ рдмреАрдЪ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЕрдЧрд▓рд╛ рдорд╛рди рд╕реАрдорд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:

рдЕрдиреБрдХреНрд░рдо рдСрдмреНрдЬреЗрдХреНрдЯ 'GenerateNumberSequence' рдЕрдкрдиреЗ рдиреНрдпреВрдирддрдо рдпрд╛ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИред рдирдП рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВред

рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:

CYCLE рд╡рд┐рдХрд▓реНрдк


рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЕрдиреБрдХреНрд░рдо рдХреЛ рд▓реВрдк рдХрд░рддрд╛ рд╣реИ рдФрд░, рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ, рдЕрдиреБрдХреНрд░рдо рдиреНрдпреВрдирддрдо рд╕реЗ рдЬрд╛рд░реА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 CREATE SEQUENCE GenerateNumberSequence START WITH 20 INCREMENT BY 1 MINVALUE 10 MAXVALUE 20 CYCLE 


рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдВрдЧреЗ:
 EmpId   EmpName -----   ------- 10      Tape 20      Violet 

рдЪрдпрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
 Insert into WithSequence1(EmpId, EmpName) VALUES (NEXT VALUE FOR GenerateNumberSequence, 'Violet'), (NEXT VALUE FOR GenerateNumberSequence, 'Tape') SELECT * FROM WithSequence1; 

рдпрджрд┐ рдЖрдк рдзреНрдпрд╛рди рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдорд┐рд╢реНрд░рд┐рдд рдереАрдВред рдпрджрд┐ рд╣рдордиреЗ рджреГрд╢реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рддреЛ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реЛрдЧрд╛
 EmpId   EmpName -----   ------- 20      Violet 21      Tape 

рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рджреВрд╕рд░рд╛ рд░рд┐рдХреЙрд░реНрдб рд╡реИрдз рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░ рдЧрдпрд╛, рд╕рдВрдЦреНрдпрд╛ рдЕрдиреБрдХреНрд░рдо (10) рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдиреНрдпреВрдирддрдо рдореВрд▓реНрдп рдкрд░ рд░реАрд╕реЗрдЯ рд╣реЛ рдЧрдИред рдпрджрд┐ рдЖрдк рдЕрдм sysред рдкрд░рд┐рдгрд╛рдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдорд╛рди 10 рд╣реИред

рдЕрдЧрд▓реА рдмрд╛рд░, рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЖрдмрд╛рджреА рдЗрд╕ рддрд░рд╣ рд╣реЛ рд╕рдХрддреА рд╣реИ:
 EmpId   EmpName ----    ------- 11      Violet 12      Tape 

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЕрдиреБрдХреНрд░рдо рдЙрд╕ рдХреНрд░рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЪреВрдВрдХрд┐ "рд╡рд╛рдпрд▓реЗрдЯ" "рдЯреЗрдк" рд╕реЗ рдкрд╣рд▓реЗ рдЖрддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕рдВрдЦреНрдпрд╛ 10 рд╣реИ, рд░рд┐рдХреЙрд░реНрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛:

Next_value = Current_value + Shift рдЕрд░реНрдерд╛рдд 10 +1 "рд╡рд╛рдпрд▓реЗрдЯ" рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдм рдЕрдиреБрдХреНрд░рдо = 11 рдХрд╛ рдорд╛рди рдФрд░ рджреВрд╕рд░реЗ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдорд╛рди рд╕рдорд╛рди рд╕реВрддреНрд░ рдХреЗ рдмрд╛рдж 12 рд╣реЛрдЧрд╛ред

рдХреЛрдИ CYCLE рд╡рд┐рдХрд▓реНрдк


рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдорд╛рдирд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЕрдиреБрдХреНрд░рдо рдмрдирд╛рддреЗ рд╕рдордп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИред

рдУрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рдЕрдиреБрдХреНрд░рдо ()


рдЖрдк рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрд╡рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 --Declare a table Declare @tblEmp Table ( EmpId int identity ,EmpName varchar(50) not null ) --Populate some records Insert Into @tblEmp Select 'Niladri' Union All Select 'Arina' Union All Select 'Deepak' Union All Select 'Debasis' Union All Select 'Sachin' Union All Select 'Gaurav' Union All Select 'Rahul' Union All Select 'Jacob' Union All Select 'Williams' Union All Select 'Henry' --Fire a query SELECT e.* ,Seq = NEXT VALUE FOR GenerateNumberSequence OVER (ORDER BY EmpName) FROM @tblEmp e 

рдкрд░рд┐рдгрд╛рдо:



рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрднрд┐рд▓реЗрдЦреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдкрд░ рдЕрдиреБрдХреНрд░рдо рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд░рд┐рдХреЙрд░реНрдб рдкрд╣рд▓реЗ рдХреНрд░рдордмрджреНрдз рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЕрдиреБрдХреНрд░рдо рдХреНрд░рдорд╛рдВрдХрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реАрдорд╛рдПрдВред


рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

Sp_fterence_get_range рдлрд╝рдВрдХреНрд╢рди


рдпрджрд┐ рд╣рдо NEXT VALUE рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рддреНрдпреЗрдХ VALUES рд╕реНрддрд░ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдЬреЛ рдХреБрдЫ рд╣рдж рддрдХ рдердХрд╛рдК рджрд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдорд╛рдиреЛрдВ рдХреА рдЗрдЪреНрдЫрд┐рдд рд╢реНрд░реЗрдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП sp_fterence_get_range рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рдореИрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
 --  ,    IF EXISTS (SELECT * FROM sys.sequences WHERE NAME = N'GenerateRangeNumberSequence' AND TYPE='SO') DROP Sequence GenerateRangeNumberSequence GO --  ,    IF EXISTS (SELECT * FROM sys.objects WHERE name = N'tbl_RangeSequence' AND type = 'U') DROP TABLE tbl_RangeSequence GO SET ANSI_NULLS ON GO --   CREATE SEQUENCE GenerateRangeNumberSequence START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 2000 CYCLE GO --   CREATE TABLE [dbo].[tbl_RangeSequence]( [EmpId] [int] NOT NULL, [EmpName] [varchar](50) NOT NULL, PRIMARY KEY CLUSTERED ( [EmpId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO --     sp_sequence_get_range DECLARE @sequence_name nvarchar(100) = N'GenerateRangeNumberSequence', @range_size int = 1000, @range_first_value sql_variant, @range_last_value sql_variant, @sequence_increment sql_variant, @sequence_min_value sql_variant, @sequence_max_value sql_variant; --   sp_sequence_get_range EXEC sp_sequence_get_range @sequence_name = @sequence_name, @range_size = @range_size, @range_first_value = @range_first_value OUTPUT, @range_last_value = @range_last_value OUTPUT, @sequence_increment = @sequence_increment OUTPUT, @sequence_min_value = @sequence_min_value OUTPUT, @sequence_max_value = @sequence_max_value OUTPUT; --   SELECT @range_size AS [Range Size], @range_first_value AS [Start Value], @range_last_value AS [End Value], @sequence_increment AS [Increment], @sequence_min_value AS [Minimum Value], @sequence_max_value AS [Maximum Value]; --       ;With Cte As ( Select Rn = 1, SeqValue = Cast(@range_first_value as int) Union All Select Rn+1, Cast(SeqValue as int) + Cast( @sequence_increment as int) From Cte Where Rn<@range_last_value ) --  100  Insert into tbl_RangeSequence(EmpId, EmpName) Select SeqValue,'Name' + Cast(SeqValue as varchar(3)) From Cte Where SeqValue<=100 Option (MaxRecursion 0) --   SELECT * FROM tbl_RangeSequence 

рдпрд╣рд╛рдБ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ:



рдпрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрдХреНрд░рдо рдХреЛ 1000 рддрдХ рдмрдврд╝рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд▓рд╛рдкрддрд╛ рдорд╛рдиреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рдХрд╣реАрдВ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдорд╛рди рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред

рдЕрдиреБрдХреНрд░рдо рдФрд░ рдкрд╣рдЪрд╛рди рдХреЗ рдмреАрдЪ рддреБрд▓рдирд╛


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░рдХреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдорд╛рди рд╕рдВрдХреЗрдд рди рд░рдЦреЗрдВ:

рдФрд░ рд╕реАрдХреНрд╡реЗрдВрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╢рдмреНрджред

рдЖрдк MSDN рдкрд░ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:
  1. рд╕реГрдЬрди рдХреА рд╕реАрдорд╛
  2. рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  3. sp_sequence_get_range



рдЪрдХреНрд░ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг:
MS SQL рд╕рд░реНрд╡рд░ 2011: рд╕реНрдЯреИрдВрдб-рдЕрд▓реЛрди рдбреЗрдЯрд╛рдмреЗрд╕ , рдирдпрд╛ рдЕрдиреБрдХреНрд░рдо рдСрдмреНрдЬреЗрдХреНрдЯ , рдСрдлрд╕реЗрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ , рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ , рд░рд┐рдЬрд▓реНрдЯ рд╕реЗрдЯ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде , SSMS рдореЗрдВ рдирдпрд╛ ред

Source: https://habr.com/ru/post/In123446/


All Articles