SQL выберите или вставьте идентификатор возврата - PullRequest
9 голосов
/ 27 февраля 2012

Хорошо, поэтому быстрый вопрос SQL здесь (с использованием sql-server-2008).

У меня есть таблица сопоставления names со следующими столбцами

ID DisplayName

Сначала я хочу сделать SELECT [ID] FROM [names] WHERE [DisplayName] = 'chuck';

НО, если имя «Чак» не существует в базе данных, я хотел бы создать его и вернуть автоматически увеличенное значение ID.

Мне было интересно, есть ли в SQL какие-то встроенные средства, чтобы сделать это простым способом, или мне нужно идти по длинному маршруту?

длинный путь примерно такой

SELECT COUNT(ID) AS count, ID FROM names WHERE DisplayName='chuck'
IF(count > 0)
    SELECT ID as ReturnID;
ELSE
    BEGIN
    INSERT INTO names(DisplayName) values('chuck');
    SELECT scope_identity() as ReturnID;
    END

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

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Вы также должны позаботиться о транзакциях:

set XACT_ABORT on
begin tran

declare @ID int

select @ID = ID from names with (holdlock, updlock) WHERE DisplayName='chuck'

if @@rowcount = 0
begin
  INSERT INTO names(DisplayName) values('chuck');
  set @ID = scope_identity();
end

select @ID as ReturnID;

commit tran

Обратите внимание на использование табличных подсказок - holdlock и updlock . Они не позволяют другому потоку выполнить точно такой же запрос и создать строку во второй раз. Для получения дополнительной информации ищите изоляцию, синхронизацию, взаимоблокировки, одновременные обновления.

0 голосов
/ 27 февраля 2012

Я бы сделал:

IF (NOT EXISTS(SELECT null from names where DisplayName='Chuck'))
   INSERT INTO Names (DisplayName) Values ('Chuck')

SELECT ID as ReturnID FROM Names where DisplayName='Chuck'

Не много экономит, хотя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...