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)
我没有测试最后一个声明,但我认为很长的路要走.如果没有内置的方式,如果有人可以简单地纠正该陈述,我会很感激(因为我确定它不完全正确).
您还应该注意交易:
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)
注意表提示的使用- HOLDLOCK和UPDLOCK。它们防止另一个线程执行完全相同的查询并再次创建该行。有关更多信息,请查找隔离、同步、死锁、并发更新。
| 归档时间: |
|
| 查看次数: |
7564 次 |
| 最近记录: |