【问题标题】:SQL multiple INSERT OR UPDATESQL 多个 INSERT OR UPDATE
【发布时间】:2017-01-11 17:18:30
【问题描述】:

我以这种方式将一组值(1 条记录)保存到表中:

UPDATE Table SET ...
IF @@ROWCOUNT = 0 INSERT INTO Table ...

这很好,但现在我需要同时添加更多独立记录,所以我尝试了类似的方法:

UPDATE Table SET ...
IF @@ROWCOUNT = 0 INSERT INTO Table ...

UPDATE Table SET ...
IF @@ROWCOUNT < 2 INSERT INTO Table ...

UPDATE Table SET ...
IF @@ROWCOUNT < 3 INSERT INTO Table ...

UPDATE Table SET ...
IF @@ROWCOUNT < 4 INSERT INTO Table ...

...为了将其保存在 1 个事务中。但是,从第二个声明开始,即使特定行已经存在,它也会添加行 - 显然 @@ROWCOUNT 不计算 INSERTed 行,或者我以另一种方式误解了它的概念......

我想知道在 SQL 查询中是否有一些可行的方法来解决这个问题。在这种特殊情况下,应该可以假设所有记录都依赖于第一个记录的存在,但它不是 100% 可靠的,如果存在,我想知道更好的解决方案。

编辑 - 解决方案:

这可能不适用于所有应用程序(请注意,特定更新不会单独检查),但在我的情况下,它似乎运行良好并且也应该与数据一致,因为更新/插入的数据集是不可分割的。

UPDATE Table SET ...  
UPDATE Table SET ... 
UPDATE Table SET ... 
UPDATE Table SET ... 
IF @@ROWCOUNT = 0 
BEGIN
   INSERT INTO Table ...
   INSERT INTO Table ...
   INSERT INTO Table ...
   INSERT INTO Table ...
END

【问题讨论】:

  • 你应该可以把它变成一个子查询...类似于insert into table case when row_count = 0 then... when row_count = 1 then... end as stuff from (select count(1) as row_count from table)a;?
  • 哦等等...@@ROWCOUNT 是受第一个UPDATE 影响的行数吗?我的 tsql 相当生锈了。
  • 嗯,请原谅我缺乏知识,但是在事务完成之前子查询真的可以工作(使用新数据)吗?
  • 为什么不研究 MERGE? msdn.microsoft.com/en-us/library/bb510625.aspx试图通过痛苦的排来做这排不是一个好计划。
  • 请记住,@@ROWCOUNT 返回受 LAST 语句影响的行数。它不保留跨多个语句受影响的行数的总和。

标签: sql sql-server insert-update


【解决方案1】:

一个稍微干净的解决方案可能是使用:

DECLARE @Reasons TABLE ( Name NVARCHAR(50) PRIMARY KEY, ReasonType NVARCHAR(50))

INSERT INTO @Reasons ( Name, ReasonType ) VALUES  ( N'Review', N'Old Reason' )  

SELECT * FROM @Reasons

MERGE INTO @Reasons AS Target  
USING (VALUES 
('Recommendation','Other'),
('Review', 'Marketing'),
('Internet', 'Promotion')
)  
       AS Source (NewName, NewReasonType)  
ON Target.Name = Source.NewName  
WHEN MATCHED THEN  
UPDATE SET ReasonType = Source.NewReasonType  
WHEN NOT MATCHED BY TARGET THEN  
INSERT (Name, ReasonType) VALUES (NewName, NewReasonType)  ;

SELECT * FROM @Reasons

那么你将得到全部或一无所有,没有所有条件。有关合并语句的详细信息,请参见 https://msdn.microsoft.com/en-us/library/bb510625.aspx

【讨论】:

  • 我在这里没有看到 UPDATE 语句...?如果数据存在,则必须更新它们,前提是它们不创建新记录。
  • 啊,我错过了那部分。我会发布一个更新的解决方案。
  • 这是一个比接受的答案更好的答案。
  • 我同意这似乎是涵盖行可能已被单独修改的情况的解决方案。在我的情况下,公认的解决方案可以正常工作,没有任何限制,但我相信第二个解决方案将来也会派上用场。
【解决方案2】:

UPDATE TABLE .....
IF(condition)
BEGIN
/*
do insert here
*/
END
IF(condition)
BEGIN
/*
do insert here
*/
END

来源:SQL Tutorials

【讨论】:

  • 这看起来非常非常干净和简单。我会测试它并在测试时标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
相关资源
最近更新 更多