小编Chr*_*ris的帖子

如果不存在则插入,同时插入

我在存储过程中的插入有并发问题。该程序的相关部分是这样的:

select @_id = Id from table1 where othervalue = @_othervalue
IF( @_id IS NULL)
BEGIN
    insert into table1 (othervalue) values (@_othervalue)
    select @_id = Id from table1 where othervalue = @_othervalue
END
Run Code Online (Sandbox Code Playgroud)

当我们同时运行 3 个或 4 个这些存储过程时,我们有时会得到多个插入。

我打算像这样解决这个问题:

insert into table1 (othervalue) 
    select TOP(1) @_othervalue as othervalue from table1 WITH(UPDLOCK) 
    where NOT EXISTS ( select * from table1 where othervalue = @_othervalue )

select @_id = Id from table1 where othervalue = @_othervalue
Run Code Online (Sandbox Code Playgroud)

问题是,如何在sql server中并发插入而不重复?我必须使用 TOP 只插入一次的事实让我感到不安。

sql-server-2008 sql-server concurrency

13
推荐指数
2
解决办法
6082
查看次数

是否有任何完全声明式的 SQL 实现

我最近被一个错误(在我的代码中)所困扰,其中这两个查询的运行时截然不同:

select * from smalltable st
    inner join bigtable bt on st.btid = bt.btid

select * from bigtable bt
    inner join smalltable st on bt.btid = st.btid
Run Code Online (Sandbox Code Playgroud)

以及单个查询在 where 过滤器中为不同的字符串寻找不同的执行计划。

是否有任何优化的、完全声明性的 SQL 标准实现,以便上述两个查询具有相同的执行计划?

optimization sql-standard

6
推荐指数
1
解决办法
161
查看次数