【发布时间】: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