2017-01-18 1 views
1

У меня есть таблица на SQL Server с столбцом идентификаторов.Вставить значения в столбец идентификаторов вручную и автоматически в одном запросе

Мне нужно вставить в него N + M строк. Для N строк мне нужно вручную вставить значение столбца идентификатора. Для других M строк значение для столбца идентификации должно быть автоматически сгенерировано.

Каждая строка входных данных имеет атрибут (бит-столбец), который определяет, должно ли значение быть автоматически сгенерировано или создано вручную.

I может достичь его с двумя отдельными операторами INSERT - один с SET IDENTITY_INSERT ON для N строк, а другой с IDENTITY_INSERT OFF для строк M.

Вопрос: Можно ли достичь этого с помощью ОДНОГО одиночного оператора INSERT, т.е. используя некоторую встроенную функцию, которая генерирует значения для столбца идентификации?

+0

Какую версию SQL Server вы используете? SQL Server 2012+ имеет 'SEQUENCE'. –

+0

Я использую SQL 2016 SP1 – Anton

ответ

2

Некоторые моделирования вставки идентичности:

CREATE TABLE #Test (Id int IDENTITY(1,1) PRIMARY KEY, Value int) 

INSERT INTO #Test 
VALUES 
(100), 
(200) 

SELECT * 
FROM #Test AS t 

DECLARE @Temp TABLE (Id int, Value int, SetId bit) 
INSERT INTO @Temp 
VALUES 
(-1, 1,1), 
(-2, 2,1), 
(-1, 33,0), 
(-1, 44,0) 

SET IDENTITY_INSERT #Test ON 

INSERT INTO #Test 
(Id, Value) 
SELECT 
    CASE(t.SetId) 
     WHEN 1 THEN t.Id --just insert new Id 
     WHEN 0 THEN 
      IDENT_CURRENT('#Test') --get last identity value 
      + ROW_NUMBER() OVER(ORDER BY t.Id) --simulate identity +1 
      - (SELECT COUNT(*) FROM @Temp AS t2 WHERE t2.SetId = 1) --skip inserted rows with Id 
      + 1 
    END, 
    t.[Value] 
FROM @Temp AS t 

SET IDENTITY_INSERT #Test OFF 

SELECT * 
FROM #Test AS t 

DROP TABLE #Test 
+0

Спасибо, спиной! Считаете ли вы, что этот метод будет работать лучше, чем два отдельных INSERT? Время от времени целевые и исходные таблицы могут содержать миллионы строк. Является ли IDENT_CURRENT() той же самой функцией, которую SQL-модуль вызывает для каждой вставленной строки, когда столбец идентификации автогенерируется? – Anton

+0

@ Антон, я думаю, 2 отдельных вставки намного лучше. Вы получите простой код, который легко поддерживать. 'IDENT_CURRENT' возвращает последнее сгенерированное удостоверение для таблицы: https://msdn.microsoft.com/en-us/library/ms175098.aspx – Backs

+1

Имейте в виду, что если вы используете' IDENT_CURRENT', у вас будут проблемы, если есть что два отдельных процесса попытаются вставить значения одновременно. Два отдельных 'INSERT' всегда будут работать правильно. –

Смежные вопросы