sql-server - 通过临时表更新和插入
问题描述
我正在尝试使用存储过程一次更新多条记录,如果该记录不在表中,则必须将其作为新记录插入。我把 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
解决方案
为此,我建议使用 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 */
)
推荐阅读
- azure - .NET Core Azure Web App An attempt was made to access a socket in a way forbidden by its access permissions
- php - 如何使用 Laravel 更新图像?
- python-3.x - 有没有办法简化这个功能,它看起来如何?
- amazon-web-services - 如何使用 AWS_PROXY 模式通过 API Gateway 和 CloudFront 通过 AWS Lambda 返回二进制内容?
- microsoft-cognitive - Luis 测试工具日期时间与本地解析的日期时间不同
- nginx - 用于rest api的nginx服务器块属性'root'
- javascript - 尝试检查是否选中了任何事件复选框
- video - 如何使用 ffmpeg 加速创建视频马赛克
- python - TypeError:字段“id”需要一个数字,但在 0x000002B6ADE878D0 处获得了 DeferredAttribute 对象
- activemq-artemis - ActiveMQ Artemis 什么时候清理 group id map