SQL 多次插入或更新
SQL multiple INSERT OR UPDATE
我以这种方式将一组值(1 条记录)保存到 table:
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
ed 行,或者我以另一种方式误解了它的概念......
我想知道是否有一些可行的方法可以在 SQL 查询中解决这个问题。在这种特殊情况下,应该 可以假设所有记录都依赖于第一个记录的存在,但它不是 100% 可靠的,我想知道一个更好的解决方案,如果存在。
编辑 - 解决方案:
这可能并非在所有应用程序中都可行(请注意,不会单独检查特定更新),但在我的情况下它似乎运行良好并且应该也与数据一致,因为 updated/inserted数据完整。
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
UPDATE TABLE .....
IF(condition)
BEGIN
/*
do insert here
*/
END
IF(condition)
BEGIN
/*
do insert here
*/
END
解决您的问题的更简洁的方法可能是使用:
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 条记录)保存到 table:
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
ed 行,或者我以另一种方式误解了它的概念......
我想知道是否有一些可行的方法可以在 SQL 查询中解决这个问题。在这种特殊情况下,应该 可以假设所有记录都依赖于第一个记录的存在,但它不是 100% 可靠的,我想知道一个更好的解决方案,如果存在。
编辑 - 解决方案:
这可能并非在所有应用程序中都可行(请注意,不会单独检查特定更新),但在我的情况下它似乎运行良好并且应该也与数据一致,因为 updated/inserted数据完整。
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
UPDATE TABLE .....
IF(condition)
BEGIN
/*
do insert here
*/
END
IF(condition)
BEGIN
/*
do insert here
*/
END
解决您的问题的更简洁的方法可能是使用:
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 详细信息。