Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Use NEWSEQUENTIALID() para criar um GUID de incremento no SQL Server


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.