我创建了此存储过程,以比较表中的所有记录(如果存在且更改了记录,则比较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
答案 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>