No SQL Server, você pode usar o
NEWSEQUENTIALID()
função para criar valores únicos incrementais. Ele cria um GUID (Globally Unique IDentifier) que é maior do que qualquer GUID gerado anteriormente por essa função em um computador especificado desde que o sistema operacional foi iniciado. Depois de reiniciar o sistema operacional, o GUID pode iniciar novamente a partir de um intervalo inferior, mas ainda é globalmente exclusivo.
O
NEWSEQUENTIALID()
função só pode ser usada com DEFAULT
restrições nas colunas da tabela do tipo identificador exclusivo . Portanto, você não pode simplesmente executar uma consulta como SELECT NEWSEQUENTIALID()
e espere que funcione (mas você pode faça isso com o NEWID()
função). Exemplo 1 - Como valor PADRÃO
Aqui está um exemplo rápido para demonstrar como funciona:
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;
Resultado:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | +--------------------------------------+-----------------+
Observe que os GUIDs foram gerados como parte do
DEFAULT
restrição na mesa. Eles não foram fornecidos explicitamente no INSERT
demonstração. Exemplo 2 - Fornecido explicitamente na declaração INSERT
Veja o que acontece se você tentar usar
NEWSEQUENTIALID()
em seu INSERT
demonstração:INSERT Prisoner (PrisonerId, PrisonerName) VALUES (NEWSEQUENTIALID(), 'Kramer');
Resultado:
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.
Portanto, ele precisa fazer parte de um
DEFAULT
restrição (como no exemplo anterior). Para inserir os dados acima, tudo o que precisamos fazer é remover a primeira coluna do
INSERT
Operação:INSERT Prisoner (PrisonerName) VALUES ('Kramer'); SELECT * FROM Prisoner;
Resultado:
+--------------------------------------+-----------------+ | 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 | +--------------------------------------+-----------------+
Exemplo 3 – Usado em uma instrução SELECT
Você receberá o mesmo erro se tentar usar esta função em um
SELECT
básico declaração como esta:SELECT NEWSEQUENTIALID();
Resultado:
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.
Segurança/Privacidade
É recomendado não usar
NEWSEQUENTIALID()
para dados confidenciais, pois é possível adivinhar o valor do próximo GUID gerado e, portanto, acessar os dados associados a esse GUID.