SQL多个INSERT或UPDATE

时间:2017-01-11 17:18:31

标签: sql sql-server insert-update

我以这种方式将一组值(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不计算INSERT行,或者我以另一种方式误解了它的概念......

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

编辑 - 解决方案:

这可能在所有应用程序中都不可能(请注意,不会单独检查特定更新),但在我的情况下,它可以很好地工作并且也应该与数据保持一致,因为更新/插入的数据集是不可或缺的。

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

2 个答案:

答案 0 :(得分:3)

稍微更清洁的解决方案可能是使用:

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详细信息。

答案 1 :(得分:2)

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

来源:SQL Tutorials