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 ();