Идентификаторы пакетного автоинкремента для вставки нескольких строк - PullRequest
0 голосов
/ 18 февраля 2019

Я работаю в SQL Server 2017, и у меня есть таблица вида:

tbl_current

COL1   COL2
-----------
 A      1
 B      3
 C     56

, которую я хочу периодически вставлять вtable tbl_release.

В этой таблице будет дополнительный столбец ID, который я хотел бы автоматически увеличивать при каждой «пакетной вставке».Например, допустим, я выполняю ввод tbl_current в tbl_release, это будет выглядеть так:

tbl_release

ID   COL1   COL2
----------------
 1    A       1
 1    B       3
 1    C      56 

Теперь давайтескажем, я выполняю другой прием пищи с теми же данными, это будет выглядеть так:

tbl_release

ID   COL1   COL2
----------------
 1    A       1
 1    B       3
 1    C      56 
 2    A       1
 2    B       3
 2    C      56  

Каков наилучший способ достичь этого?Есть ли какая-либо функция SQL Server, которая позволила бы достичь этого, или мне нужно выполнить некоторые подзапросы?

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Я бы лично использовал последовательность для этого.Предполагая, что вставка в вашу эфемерную таблицу завершена, она будет выглядеть примерно так:

declare @ID int = next value for sequence dbo.mySequence;

insert into tbl_release
   (ID, col1, col2)
select @ID, col1, col2
from tbl_current;
0 голосов
/ 18 февраля 2019

Ваш id действительно объект.Я настоятельно рекомендую вам дать ему полную таблицу:

create table batches (
    batch_id int identity(1, 1) primary key,
    batch_start_date datetime,
    . . . 
);

Тогда ваша существующая таблица должна быть структурирована как:

create table releases (
    release_id int identity(1, 1) primary key,
    batch_id int not null references batches(batch_id),
    col1 char(1),
    col2 int
);

Таким образом, ваша база данных имеет ссылочную целостность.

0 голосов
/ 18 февраля 2019

Вы можете попробовать это, используя функцию MAX(), как показано ниже.

Declare @maxId int
set @maxId = (Select isnull(id, 0) from tbl_Current)
set @maxId = @maxId + 1
--Now to insert
insert into tbl_release values (@maxId, <Column1Value>, <Column2Value>)

Для множественной вставки вы можете попробовать это

INSERT INTO tbl_release
SELECT @maxId, col1, col2 FROM tbl_Current

Если столбец Id вашей таблицы является тождественным, то вытакже можно использовать Scope_Identity , чтобы получить максимальное значение столбца Id.

...