Sekwenecje w Sql Server – Mssql

W Sql server 2011 Microsoft udostępnia mechanizm sekwencji. Sekwencja jest mechanizmem zasadniczo podobnym do mechanizmu Identity lub autoincrement. Zasadniczą różnicą pomiędzy wspomnianymi mechanizmami jest fakt iż sekwencje nie są związane z tabelą. Z sekwencji możemy w dowolnym momencie pobrać kolejną wartość. Osoby mające doświadczenia z produktami Oracle z pewnością ucieszy obsługa omawianego mechanizmu w produkcie z Redmont.

Aby utworzyć sekwencję w MSSQL DENALI:

CREATE SEQUENCE dbo.nowa_sek
AS INT
MINVALUE 1
NO MAXVALUE
START WITH 1;

pobranie wartości z Sekwencji:

SELECT NextOrderID = NEXT VALUE FOR dbo.nowa_sek

wstawianie danych przy uzyciu sekwencji:

create table testowa (id int not null primary key,opis varchar(255))

insert into testowa values (NEXT VALUE FOR dbo.nowa_sek,'jakis opis');

Kolejną cechą sekwencji jest możliwość jej cofnięcia do dowolnej wartości

ALTER SEQUENCE dbo.nowa_sek
RESTART WITH 20;

Można także określić maksymalną wartość sekwencji, jednak podczas tworzenia możemy otrzymać ostrzeżenie:

The sequence object ‘nowa_sek’ cache size is greater than the number of available values; the cache size has been automatically set to accommodate the remaining sequence values.

W skrócie oznacza to ustawienie odpowiedniej wielkości Cache.

CREATE SEQUENCE dbo.nowa_sek
MINVALUE 1
MAXVALUE 20
START WITH 1;
GO

Gdy sekwencja dojdzie do wartości 20 przy próbie pobrania kolejnej wartości otrzymamy:

The sequence object ‘nowa_sek’ has reached its minimum or maximum value. Restart the sequence object to allow new values to be generated.

Gdy chcemy by sekwencja się zapętlała:
CREATE SEQUENCE dbo.nowa_sek
AS INT
MINVALUE 1
MAXVALUE 2
cycle
START WITH 1;

wtedy jedynymi wartościami z sekwencji będzie 1 i 2.

To co jest istotne, podobnie jak w przypadku Identity i sekwencji oraclowych – istnieje duże prawdopodobieństwo wystąpienia dziur w numeracji. W przypadku pobrania wartości i wykonania rollback transakcji, wartość zostanie utracona.

Niestety Microsoft nie stworzył funkcji zwracającej current value (aktualna wartość sekwencji).

Aby pobrać informację o wartości sekwencji należy wykonać zapytanie sql:
SELECT current_value
FROM sys.sequences
WHERE name = ‘nowa_sek’;

Sql Server 2011 – Denali – CTP1

Microsoft pracuje nad kolejną wersją SQL Server’a. Z sieci można pobrać wersję ‘beta’ oznaczoną CTP o nazwie kodowej DENALI. To co mogę polecić to ściągnięcie tej wersji chociażby dla samego SSMS (SQL Server Management Studio). Osobiście doświadczyłem wielu problemów z SSMS dostarczanym do MSSQL 2008 i 2008R2 (w środowisku Windows 7 64bit). Oczywiście Denali to nie tylko SSMS, sam server zyskał także kilka nowych funkcjonalności:
rozszerzenie metod typów Spatial, oraz mechanizm sekwencji (znany z rozwiązań Oracle).

Od wersji 2008 w SSMS mamy adsense wspomagający budowanie zapytań. Działa on dużo sprawniej w DENALI. Wyszukuje nazwy po zawieranej frazie, a nie jak w przypadku poprzednich wersji po początku frazy.
Dla przykładu kolumna prefix_id – zostanie odnaleziona po napisaniu samego id. Niestety firma z Redmont nadal sortuje kolumny po nazwie a nie kolejności w definicji tabeli(w adsense). Narzędzie PL/Sql developer dedykowane do baz oraclowych mimo iż interfejs ma dużo bardziej toporny to funkcje związane z podpowiadaniem kodu nadal realizuje lepiej.

Dla osób które się frustrują pewną przypadłością SMSS – mianowicie tworząc nową tabele lub widok, adsense jej nie wykrywa. Jest to dość irytujące gdy tworzymy strukturę i testujemy jakieś proste zapytania. Adsense podkreśla nam elementy zapytań jako błędne. Aby temu zapobiec należy skorzystać z skrótu klawiszowego ctrl + shift + r.