首页 > 解决方案 > 通过临时表更新和插入

问题描述

我正在尝试使用存储过程一次更新多条记录,如果该记录不在表中,则必须将其作为新记录插入。我把 Id 作为桌子上的主键。我在下面尝试的方法是首先将数据插入临时表,然后更新原始表。我使用类似帖子中的示例存储过程来创建它,因为我对编写存储过程有点陌生,我在存储时遇到错误程序。请帮忙

CREATE PROCEDURE [dbo].[xxxxxx]

DECLARE @Tbl  TABLE(
Id [int] NOT NULL PRIMARY KEY,
Payroll_Id [int],
ProductCode  nvarchar(255),
Description nvarchar (255),
Qty  nvarchar(255))


BEGIN


INSERT  INTO @Tb1 ([Payroll_Id],[ProductCode],[Description],[Qty])
 Select  @Paroll_Id as [Paroll_Id],@ProductCode as [ProductCode],@Description as [Description], @Qty as [Qty]

Update tps
Set [Payroll_Id]= tmp.Payroll_Id


,[ProductCode]= tmp.ProductCode
,[Description] = tmp.Description
,[Qty] = tmp.Qty
FROM dbo.SmLine tps
INNER JOIN @Tb1 tmp on tmp.Id= tps.Id
INSERT INTO SMLine ([Payroll_Id],[ProductCode],[Description],[Qty]) 
Select
tmp.Payroll_Id,tmp.ProductCode,tmp.Description,tmp.Qty
From @Tb1 tmp
LEFT JOIN dbo.SMLine tps ON tps.Id = tmp.Id
WHERE dbo.SmLine IS NULL
END

标签: sql-servertsqlstored-procedures

解决方案


为此,我建议使用 MERGE 语句。

 MERGE dbo.destination_table AS target  
 USING 
 (
      /* SELECT statement for source data */
 ) AS source
 ON 
 (
     /* key column conditions to identify if record exits or not 
     i.e. target.id= source.id */
 )  
 WHEN MATCHED THEN   
    UPDATE SET Name = source.Name  
 WHEN NOT MATCHED THEN  
    INSERT 
    (
      /* some columns from target */
    )  
    VALUES 
    (
      /* some values from source */
    ) 

推荐阅读