【问题标题】:Insert and update multiple records via same stored procedure通过同一个存储过程插入和更新多条记录
【发布时间】:2019-08-22 08:16:40
【问题描述】:

我创建了这个存储过程来遍历表中的所有记录,比较 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

【问题讨论】:

  • 这个过程只能处理单行,如果你想处理多行,你需要使用不同的方法——比如表值参数。我根据这是 SQL Server 的语法猜测 - 看看 Aaron Bertrand 发布的this answer
  • 请定义剂量似乎可以正常工作。任何错误信息?任何意外行为(如果是,那是什么行为?)
  • 感谢您的所有建议,Vikram 您的代码似乎可以工作,但是当 vb 端的前端未提供 id 时,我收到字符串转换错误,因为它正在尝试转换空白未提供 Id 时的值。这可以从 sql 存储过程中处理吗? “如果存在(从 Smline 中选择 Id,其中 Id =@id 或 Id > 0)”
  • 您的“@id”参数不是可选的。您必须将其传入。(如前所述)您的更新需要有一个过滤 @id 的 where 子句(或者您将更新表中的每一行)。您的程序是基于“单行”的(也就是一次只能更新或插入一行)。如果要处理多行,则需要不同的输入。互联网搜索“sql server shred xml”示例。

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


【解决方案1】:

您的 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

【讨论】:

    【解决方案2】:
    IF EXISTS(SELECT Id from Smline where Id =@id)
    BEGIN 
    update dbo.SmLine
    Set [Payroll_Id]= @Payroll_Id
    ,ProductCode= @ProductCode
    ,Description = @Description
    ,Qty = @Qty
    WHERE  Id = @Id  
    END
    ELSE
    BEGIN 
    INSERT INTO SmLine ([Payroll_Id],[ProductCode],[Description],[Qty])
    VALUES (@Payroll_Id,@ProductCode ,@Description,@Qty)
    END   
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您的更新语句缺少 where 语句。这是一个主要的“禁止”,因为它会(上帝保佑......)更新表格中的所有行。

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

        【讨论】:

          猜你喜欢
          • 2019-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多