Como crio uma tabela com uma coluna que usa uma sequência?

10

Eu tenho o seguinte

CREATE TABLE [MyTable]
(
    [ID] [bigint] PRIMARY KEY NOT NULL,
    [Title] [nvarchar](64) NOT NULL
)

CREATE SEQUENCE MyTableID
    START WITH 1
    INCREMENT BY 1
    NO CACHE
    ;
GO

Quero inserir novos registros no MyTable e definir o ID para o próximo valor da sequência. Como eu posso fazer isso? Um gatilho, talvez, ou existe alguma outra maneira? Quão?

Como estou usando o SQL Server 2012, não quero usar o Identity por causa do bug do gap .

BrunoLM
fonte

Respostas:

16

Atribua-a como a propriedade padrão para a coluna

CREATE TABLE [MyTable]
(
    [ID] [bigint] PRIMARY KEY NOT NULL DEFAULT (NEXT VALUE FOR dbo.MyTableID),
    [Title] [nvarchar](64) NOT NULL
);

Futuros leitores, uma Sequência poderá ter uma lacuna se o serviço for interrompido inesperadamente, o valor das entidades no CACHE poderá ser perdido. Aqui, eles estão especificandono cache para atenuar isso com a troca de desempenho mais lento para o objeto de sequência.

Referência CREATE SEQUENCE

billinkc
fonte
É seguro usar cacheneste caso? No link de conexão, a Microsoft nos diz para usar no cache.
BrunoLM
@BrunoLM Depende de quão grande / pequeno de um banco de dados estamos falando e de quantas transações por segundo / minuto estamos falando.
22813 Techie Joe
2

Para usar a SEQUENCEem uma INSERTdeclaração, você pode tentar o seguinte:

INSERT INTO [MyTable] ([ID],[TITLE]) VALUES (NEXT VALUE FOR dbo.MyTableID, @TITLE) 

NEXT VALUE FOR dbo.MyTableIDé a sintaxe para obter o próximo número de a SEQUENCE.

Techie Joe
fonte
0

Você pode usar uma sequência para várias tabelas, conforme demonstrado no seguinte exemplo:

CREATE SEQUENCE dbo.MyTableID
    START WITH 1
    INCREMENT BY 1
    NO CACHE
    ;
GO

CREATE TABLE dbo.[MyTable1]
(
    [ID] [bigint] PRIMARY KEY NOT NULL DEFAULT (NEXT VALUE FOR dbo.MyTableID),
    [Title1] [nvarchar](64) NOT NULL
);

CREATE TABLE dbo.[MyTable2]
(
    [ID] [bigint] PRIMARY KEY NOT NULL DEFAULT (NEXT VALUE FOR dbo.MyTableID),
    [Title2] [nvarchar](64) NOT NULL
);

--Insert 2 rows
insert into  [MyTable1] (title1)
select 'title11'

insert into  [MyTable1] (title1)
select 'title12';

insert into  [MyTable2] (title2)
select 'title21'

insert into  [MyTable2] (title2)
select 'title22';

select f1.*, 'Into MyTable1' Tb from  [MyTable1] f1
union all
select f1.*, 'Into MyTable2' Tb from  [MyTable2] f1

Resultado:

+----+---------+---------------+
| ID | Title1  |      Tb       |
+----+---------+---------------+
|  1 | title11 | Into MyTable1 |
|  2 | title12 | Into MyTable1 |
|  3 | title21 | Into MyTable2 |
|  4 | title22 | Into MyTable2 |
+----+---------+---------------+

sqlfiddle

Esperento57
fonte