В SQL Server можете да използвате NEWSEQUENTIALID() функция за създаване на постепенни уникални стойности.
Той създава GUID (глобално уникален идентификатор), който е по-голям от всеки GUID, генериран преди това от тази функция на посочен компютър от стартирането на операционната система. След рестартиране на операционната система, GUID може да започне отново от по-нисък диапазон, но все още е глобално уникален.
NEWSEQUENTIALID() функцията може да се използва само с DEFAULT ограничения за колоните на таблицата от тип uniqueidentifier . Следователно не можете просто да изпълните заявка като SELECT NEWSEQUENTIALID() и очаквайте да работи (но вие можете направете това с NEWID() функция).
Пример 1 – като стойност по подразбиране
Ето един бърз пример, за да демонстрирате как работи:
USE Test;
CREATE TABLE Prisoner
(
PrisonerId uniqueidentifier NOT NULL DEFAULT NEWSEQUENTIALID(),
PrisonerName varchar(70) NOT NULL,
);
INSERT Prisoner (PrisonerName)
VALUES
('Jerry Seinfeld'),
('George Costanza'),
('Elaine Benes');
SELECT * FROM Prisoner;
Резултат:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | +--------------------------------------+-----------------+
Имайте предвид, че GUID са генерирани като част от DEFAULT ограничение на масата. Те не бяха изрично предоставени в INSERT изявление.
Пример 2 – Изрично предоставено в изявлението INSERT
Ето какво се случва, ако се опитате да използвате NEWSEQUENTIALID() във вашия INSERT изявление:
INSERT Prisoner (PrisonerId, PrisonerName) VALUES (NEWSEQUENTIALID(), 'Kramer');
Резултат:
Msg 302, Level 16, State 0, Line 1 The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
Така че трябва да е част от DEFAULT ограничение (както в предишния пример).
За да вмъкнем горните данни, всичко, което трябва да направим, е да премахнем първата колона от INSERT операция:
INSERT Prisoner (PrisonerName)
VALUES ('Kramer');
SELECT * FROM Prisoner;
Резултат:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | | b76d433e-f36b-1410-8a80-007d2b533547 | Kramer | +--------------------------------------+-----------------+
Пример 3 – Използва се в оператор SELECT
Ще получите същата грешка, ако се опитате да използвате тази функция в основен SELECT изявление като това:
SELECT NEWSEQUENTIALID();
Резултат:
Msg 302, Level 16, State 0, Line 1 The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
Сигурност/Поверителност
Препоръчително е да не използвате NEWSEQUENTIALID() за чувствителни данни, тъй като е възможно да се отгатне стойността на следващия генериран GUID и следователно да получите достъп до данни, свързани с този GUID.