sql - SQL SERVER通过表值参数插入/更新表记录
问题描述
我有将表值参数作为输入的存储过程。它有大约 15-20 列。我想在没有 MERGE 的情况下执行插入/更新,因为通过 MERGE 锁定了 table 。另外通过研究我了解到,也可以使用游标。但是 CURSOR 会降低性能。我找到了这篇文章(https://www.dotnettricks.com/learn/sqlserver/sql-server-cursor-alternatives ),在 while 循环中我们获取每个列变量,对于列大于 10 的表会很乏味. 那么,我还有其他选择吗?
解决方案
您可以创建一个存储过程并像下面的代码一样传递您的参数:
CREATE PROCEDURE [dbo].[MyStoredProcedure]
@TableValue [dbo].[TABLETYPE] READONLY
AS
BEGIN
UPDATE [dbo].[MyTable]
SET Name = T.Name
FROM [dbo].[MyTable]
INNER JOIN @TableValue AS T ON T.Id = [dbo].[MyTable].Id
WHERE T.Name <> [dbo].[MyTable].Name
INSERT INTO [dbo].[MyTable](Id,Name)
SELECT Id , Name
FROM @TableValue AS T
WHERE NOT EXISTS(SELECT *
FROM [dbo].[MyTable]
WHERE Id = T.Id)
END
GO
首先更新现有记录,然后插入新行。
推荐阅读
- javascript - 如何为 javascript 中的inquirer.prompt 问题的答案创建函数参数(变量)?MySQL也参与其中
- c++ - 我不知道为什么这个 static_assert() 代码不起作用
- python - TypeError:列表索引必须是整数或切片,而不是str,discord py
- r - 跨列的逐行操作
- python - 检查一个列表的每个元素是否是另一个列表的所有元素的倍数
- clion - 如何在 CLion 中包装一长串值?
- c# - 与 ASP.NET MVC BeginExecuteCore 等效的 ASP.NET Core
- java - 如何使用 selenium java 在对话框中自动滚动
- html - 相对位置如何使 dom 节点在固定位置上绘制?
- java - 使用 twaitforfile 或自定义 java 代码将文件从一个目录传输到另一个目录时如何诱导时间延迟?