ПредишенСледващото

Microsoft често критикувани за това, че в SQL Server, все още не е изпълнение на нещо подобно последователност в Oracle.

В рамките на подготовката, аз станах се интересува от това, което предлагаме в този състезател и осъзнах, че нищо друго освен един стар приятел на идентичността ", но по различен начин", защото знам, че бизнес се нуждае от там, за да докладва за всички видове идентификатори, броячи и други на руски SQL Server User Group не.

Да предположим, че има циклична. Това е добре, но за да го меко казано, не на първо място, ако е необходимо.
Е, тази последователност може да се използва като функция, не само като стойност по подразбиране за полето на масата, а не да бъдат свързани с момента на получаване на стойността на физическия аспект на добавяне на записи.
Но истинските основните изисквания - името на динамична последователност формация (или който и да е друг начин да се реализира "Искам номерирането от началото на годината / месец") и най-малко някакъв механизъм на "ре" става "липсващите стойности" отсъстват и там.
И ако един бизнес не може да произведе най-малко някои критерии за контрол на тези последователности, а след това всъщност не ме интересува какво функцията генериране на последователност - идентичност, последователност или NEWID - не много разлика, и трите решения са подходящи еднакво лошо за номера на фактурата и фактурата.

Обикновено се предлага в генерирането на решения за "бизнес стаи", написани на TSQL и таблици въз основа на настоящите стойности на гишетата са zhutchayshy един недостатък - заключване. Всъщност, ако се "генерира" нов номер, по време на производството, ние трябва да блокира тезгяха до другата връзка не е получена на същата стойност. И като правило, броят трябва да влязат в един вече е отворен сделка, която е изпълнена с факта, че двамата първоначално независими от бизнес процеса ще бъде в най-добрия дълъг блок един от друг, а в най-лошия - ще не толкова независими, за да се избегне застой (безизходица).

В допълнение, производството на номера, базирани на гишетата на масата не може да бъде "опакован" във функция, което би било много желателно да се прилагат от вида на проекти:

вмъкнете в MyTable (DocNum. DocDate. Коментар)
изберете Generator. NextValue ( "SequenceFor_DocNum"), IncomeDate. коментар
от #SomeBuffer


защото функцията не е всяка промяна на данните и не можем да променим текущата стойност.

Но това не е всичко! Функцията е способността да се обадя на разширени съхранени процедури и CLR процедурите и функциите.

Но във функцията CLR ние сме в състояние да се свърже с един и същ сървър и базата данни, но в различна връзка и се обадете на процедурата, ние се интересуваме от генериране на една стая, без да налагат продължителни ключалки.
Той ще трябва да направи няколко допълнителни стъпки в допълнение към написването на функцията:

Сега нека да преминем, "Много bukf" за по-чиста T-SQL код.
Какво е интересно, по едно и също TSQL и ние ще направим самото събрание - няма нужда дори VisualStudio, но повече за това по-късно.

(Всички заявки се изпълняват в основата, където имаме нужда от броячи)

Създаване на сървър - включва CLR:

ако съществува (изберете * от сис. конфигурации, където името = 'CLR активирана "и value_in_use = 0)

EXEC ( "sp_configure '' показване на разширените възможности '', 1 ')

EXEC ( "sp_configure '' CLR активиран '', 1 ')

Създаване на база - оставете да работи опасни възли:

декларира @sql nvarchar (макс)

избран @sql = N'alter база данни "+ db_name () + N 'определен надежден относно"

Създаване _Generator верига, която ще бъде на основните съоръжения, необходими за манипулация на броячите:
ако SCHEMA_ID ( "_Generator") е нула EXEC ( "създаване на схема _Generator")

Създайте таблица, в която да се съхранява параметрите на броячите:

Създаване на таблица _Generator. списък

ID uniqueidentifier не нула newid подразбиране ().

Име sysname не нула,

StartValue вътр не нула ограничение DF__Generator_List_StartValue подразбиране 0.

ограничение PK_List_ID основен ключ струпани (ID),

ограничение AK_List_Name уникален (Name)

Сега, да създадете задействане, което за всяка промяна в _Generator.List брояч ще създаде в схемата с името G $ imya_schetchika на. NextValue функция и CurrentValue. И в зависимост от изпълнението параметър IsWorkWithHoles NextValue функции са малко по-различни.

създаване на спусъка [_Generator]. [TR_List_UpdateGenerator] в [_Generator]. [Списък]

с изпълнение като собственик

след вмъкване. актуализира. изтривам

поставените ansi_nulls на

@name nvarchar (128),

Сега такава дреболия като блока на CLR.

Подозирам, че не всички разработчици са база данни приятелски с C # и VisualStudio и настояще как да компилирате събранието.

Шансовете са също много малко хора искат да се доверят на събранието, изложени в DLL.

Ето защо, ние се съберат и да се създаде събрание директно в T-SQL. Единственото изискване - в SQL Server трябва да бъде инсталиран .NET Framework 3.5:

@t маса (ТХТ VARCHAR (255))

@temp VARCHAR (255),

@sql VARCHAR (8000)

@cs VARCHAR (макс)

-- Осъществяване на базата данни заслужаващ доверие

избран @sql = 'променя база данни "+ db_name () +' определен надежден относно"

EXEC xp_cmdshell "настроен"

изберете @temp = подниз (ТХТ. 6. 255)

където TXT като "TEMP%"

определя, използвайки система @cs =;

публична частична клас PGenerator

публично статично SqlInt32 NextValue (SqlString последователност, SqlInt32 SPID, SqlString ServerName, SqlString DatabaseName)

като се използва (SqlConnection IsolatedConn

= New SqlConnection ( "Интегриран сигурност = вярно; Първоначална Catalog =" + DatabaseName.ToString () + "; сървъра =" + ServerName.ToString () + "; Приложение Наименование = _Generator_for_" + SPID.ToString () + "; Записване = фалшива "))

SqlCommand GenValue = нов SqlCommand ( "_ Generator.GenerateValue", IsolatedConn);

SqlParameter задържане = нов SqlParameter ();

SqlInt32 Val = (INT) GenValue.Parameters [ "ReturnValue"] Стойност .;

публично статично SqlInt32 NextValueHole (SqlString последователност, SqlInt32 SPID, SqlString ServerName, SqlString DatabaseName)

като се използва (SqlConnection IsolatedConn

= New SqlConnection ( "Интегриран сигурност = вярно; Първоначална Catalog =" + DatabaseName.ToString () + "; сървъра =" + ServerName.ToString () + "; Приложение Наименование = _Generator_for_" + SPID.ToString () + "; Записване = фалшива "))

SqlCommand GenValue = нов SqlCommand ( "_ Generator.GenerateValueHole", IsolatedConn);

SqlParameter задържане = нов SqlParameter ();

Подкрепете проекта - споделете линка, благодаря!