|
|
博学的枇杷 · SQL中的嵌套CASE语句 - · 2 周前 · |
|
|
唠叨的硬盘 · 如何实现MySQL case when ...· 2 周前 · |
|
|
微笑的青蛙 · selenium ...· 2 周前 · |
|
|
帅呆的篮球 · 子查詢 (SQL Server) - ...· 1 周前 · |
|
|
怕考试的木耳 · 软件分享库合集链接汇总推荐_蓝奏云软件分享链 ...· 4 月前 · |
|
|
精明的日记本 · 江西省发布第三批非法集资严重失信人名单 ...· 11 月前 · |
|
|
奔放的梨子 · Creating Word ...· 1 年前 · |
|
|
奔跑的苦咖啡 · 地藏菩萨本愿经讲记(第十三卷)· 2 年前 · |
|
|
愤怒的菠萝 · 异兽魔都(林田球创作的系列漫画)_搜狗百科· 2 年前 · |
我总是使用类似于下面的方法来实现它:
INSERT INTO TheTable
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
TheTable
WHERE
PrimaryKey = @primaryKey)
...but一旦加载,就会发生主键冲突。这是唯一一个插入到这个表中的语句。那么这是否意味着上面的陈述不是原子的呢?
问题是,这几乎不可能随意重新创建。
也许我可以将其更改为如下所示:
INSERT INTO TheTable
(HOLDLOCK,
UPDLOCK,
ROWLOCK)
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
TheTable
(HOLDLOCK,
UPDLOCK,
ROWLOCK)
WHERE
PrimaryKey = @primaryKey)
虽然,也许我使用了错误的锁,或者使用了太多的锁或其他什么。
我在stackoverflow.com上看到过其他问题,答案是"IF (SELECT COUNT(*) ... INSERT“等),但我总是假设(可能是错误的)一条SQL语句是原子的。
有谁有什么想法吗?
我不知道这是否是“官方”的方式,但你可以尝试
INSERT
,如果失败了,可以退回到
UPDATE
。
我在过去使用不同的方法做过类似的操作。首先,我声明一个变量来保存主键。然后,我用select语句的输出填充该变量,该语句用这些值查找记录。然后,我使用and IF语句。如果主键为空,则执行insert,否则返回一些错误代码。
DECLARE @existing varchar(10)
SET @existing = (SELECT primaryKey FROM TABLE WHERE param1field = @param1 AND param2field = @param2)
IF @existing is not null
BEGIN
INSERT INTO Table(param1Field, param2Field) VALUES(param1, param2)
Return 0
END
您可以使用MERGE:
MERGE INTO Target
USING (VALUES (@primaryKey, @value1, @value2)) Source (key, value1, value2)
ON Target.key = Source.key
WHEN MATCHED THEN
UPDATE SET value1 = Source.value1, value2 = Source.value2
WHEN NOT MATCHED BY TARGET THEN
INSERT (Name, ReasonType) VALUES (@primaryKey, @value1, @value2)
首先,向我们的man @gbn致敬,感谢他对社区的贡献。甚至无法解释我发现自己有多频繁地听从他的建议。
不管怎么说,追星族已经玩够了。
稍微补充一下他的答案,也许可以“增强”它。对于那些像我这样的人来说,在
<> 2627
场景中做什么会让人感到不安(不,空的
CATCH
不是一个选择)。我从
technet
那里找到了这个小金块。
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
BEGIN
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (
|
|
博学的枇杷 · SQL中的嵌套CASE语句 - 2 周前 |
|
|
奔放的梨子 · Creating Word Application using Excel VBA: Run-time error '429': ActiveX component can't create obje 1 年前 |
|
|
奔跑的苦咖啡 · 地藏菩萨本愿经讲记(第十三卷) 2 年前 |
|
|
愤怒的菠萝 · 异兽魔都(林田球创作的系列漫画)_搜狗百科 2 年前 |