通过相同的存储过程插入和更新多个记录

时间:2019-04-01 08:02:21

标签: sql-server tsql stored-procedures sql-insert

我创建了此存储过程,以比较表中的所有记录(如果存在且更改了记录,则比较id(主键)),进行必要的更改并更新记录。

如果该id不在表中,则插入记录。此存储过程 编译正常,但似乎无法正常工作。这需要一个while循环吗?

ALTER PROCEDURE [dbo].[SMLineUpdate]
(
  @id [int],
  @Payroll_Id [int],
  @ProductCode nvarchar(255),
  @Description nvarchar (255),
  @Qty nvarchar(255)
)
AS
IF EXISTS (SELECT Id from Smline where @id = Id) BEGIN 
  update dbo.SmLine
    Set [Payroll_Id] = @Payroll_Id
    , ProductCode = @ProductCode
    , Description = @Description
    , Qty = @Qty
END ELSE BEGIN 
  INSERT INTO SmLine ([Payroll_Id], [ProductCode], [Description], [Qty])
    VALUES (@Payroll_Id, @ProductCode, @Description, @Qty)
END

4 个答案:

答案 0 :(得分:0)

您的update查询缺少where条件

update dbo.SmLine
Set    [Payroll_Id] = @Payroll_Id
      ,ProductCode  = @ProductCode
      ,Description  = @Description
      ,Qty = @Qty
WHERE  Id = @Id      -- the query missed this where condition

答案 1 :(得分:0)

{{1}}

答案 2 :(得分:0)

您的更新语句缺少where语句。那是一个主要的“不可以”,因为它将(上帝禁止...)更新表中的所有行。

您的插入语句缺少标识插入,因此请考虑您尝试更新/插入id = 5的情况,但是现在此行已删除(在where中找不到),并且id大得多。您将搜索->找不到,并插入新行(例如id = 101),然后再次寻找id = 5,不再找到它,然后再次插入(例如id = 102),依此类推...我认为那不是您想要的。考虑一个Merge语句(匹配时/不匹配时),并获得两全其美。还可以考虑不要从表中删除,而是添加“ IsDeleted”列(该列允许“恢复”已删除的行)。

答案 3 :(得分:0)

您的SP不满足插入多个记录的要求。它仅适用于单个记录更新或插入,您必须分别传递多个ID和值以更新多个,因此使用XML之类的不同方法作为输入参数,因此您可以通过提取XML数据简单地对多个记录执行此操作。 / p>