只有在没有插入行的情况下才插入行我一直使用类似于以下内容的方法来实现这一目标:INSERT INTO TheTableSELECT
@primaryKey,
@value1,
@value2WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable WHERE
PrimaryKey = @primaryKey).但一旦被加载,就会发生主密钥违规事件.这是插入到此表中的唯一语句。那么,这是否意味着上述声明不是原子的?问题是这几乎是不可能随意重建的。也许我可以将其修改为如下内容:INSERT INTO TheTableWITH
(HOLDLOCK,
UPDLOCK,
ROWLOCK)SELECT
@primaryKey,
@value1,
@value2WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable WITH
(HOLDLOCK,
UPDLOCK,
ROWLOCK)
WHERE
PrimaryKey = @primaryKey)不过,也许我用错了锁或者用了太多的锁什么的。我在stackoverflow网站上看到了其他一些问题,其中的答案是“if(选择count(*).插入”等),但我总是假设一个SQL语句是原子的(可能是不正确的)。有人有什么想法吗?
3 回答
慕桂英4014372
TA贡献1871条经验 获得超13个赞
MERGE INTO TargetUSING (VALUES (@primaryKey, @value1, @value2)) Source (key, value1, value2)ON Target.key = Source.keyWHEN MATCHED THEN UPDATE SET value1 = Source.value1, value2 = Source.value2WHEN NOT MATCHED BY TARGET THEN INSERT (Name, ReasonType) VALUES (@primaryKey, @value1, @value2)
添加回答
举报
0/150
提交
取消