SQL选择或插入返回ID

Kel*_*ton 9 sql sql-server sql-server-2008

好吧这里有一个快速的SQL问题(使用sql-server-2008).

我有一个names包含以下列的映射表

ID DisplayName

我想先做的是 SELECT [ID] FROM [names] WHERE [DisplayName] = 'chuck';

但是,如果数据库中不存在名称'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
Run Code Online (Sandbox Code Playgroud)

我没有测试最后一个声明,但我认为很长的路要走.如果没有内置的方式,如果有人可以简单地纠正该陈述,我会很感激(因为我确定它不完全正确).

Cod*_*der 8

您还应该注意交易:

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
Run Code Online (Sandbox Code Playgroud)

注意表提示的使用- HOLDLOCKUPDLOCK。它们防止另一个线程执行完全相同的查询并再次创建该行。有关更多信息,请查找隔离、同步、死锁、并发更新。