2013-05-06 2 views
1

Я использую SQL Server 2008. Вот мой пример таблицыВставьте SCOPE_IDENTITY во время вставки

SEQ NAME GROUP 
    1 abc 1 
    2 bcd 1 
    3 cde 3 

В приведенной выше таблице, SEQ мой столбец идентификаторов (авто номер). Если я хочу, чтобы вставить новую строку с именем = «опр» и группа = 3, я могу сделать это следующим образом

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',3) 

Теперь, если я хочу, чтобы вставить новую строку, а затем установить GROUP = SEQ из недавно вставленный ряд, я делаю это в два этапа, как показано ниже

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',999) 
UPDATE SampleTable SET GROUP = SEQ where NAME = 'def' 

Есть ли способ сделать это за один шаг? Например

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',SCOPE_IDENTITY()) 

Данное заявление, очевидно, не работает, так как scope_identity() устанавливается только после того, как вставка завершена. Но есть ли способ установить GROUP = SEQ, используя один оператор insert?

+2

Какую-либо конкретную причину это необходимо сделать одной командой? –

+1

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

@YuriyGalanter - Нет. Я просто видел, есть ли лучший или более элегантный способ сделать это. – 2013-05-06 16:38:04

ответ

0

Незначительное улучшение будет меняться UPDATE для фильтрации SEQ:

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',999) 
UPDATE SampleTable SET GROUP = SEQ where SEQ = SCOPE_IDENTITY() 

Мне нравится это лучше, потому что мы, вероятно, чтобы получить кластерный индекс искать путем фильтрации на SEQ. Кроме того, я думаю, что это семантически чище.

Я не знаю, как это сделать в одном заявлении с колонкой IDENTITY (даже думая о OUTPUT и MERGE ничего не приходит на ум). Вы можете сделать это с помощью SQL Server 2012 SEQUENCE, хотя используя синтаксис INSERT...SELECT. В выбранной части вы выталкиваете одно число из последовательности и копируете его в две колонки.

+0

Мне нравится предложение по улучшению производительности! Поскольку, похоже, нет никакого способа сделать это в одном заявлении, я продолжу использовать подход с двумя утверждениями, но с улучшением, которое вы предложили. Благодаря! – 2013-05-06 18:10:55

0

вы можете сделать Group вычисляемый столбец и установите его значение будет SEQ при создании таблицы itself.Then вам просто нужно вставить название и как SEQ и GROUP будут установлены автоматически

+0

Это будет работать, только если GROUP всегда совпадает с SEQ или GROUP всегда может быть вычислена из SEQ. Для моего варианта использования иногда это может быть то же самое, что и SEQ, а иногда и другое – 2013-05-06 16:40:46

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