首页 > 解决方案 > SQL SERVER通过表值参数插入/更新表记录

问题描述

我有将表值参数作为输入的存储过程。它有大约 15-20 列。我想在没有 MERGE 的情况下执行插入/更新,因为通过 MERGE 锁定了 table 。另外通过研究我了解到,也可以使用游标。但是 CURSOR 会降低性能。我找到了这篇文章(https://www.dotnettricks.com/learn/sqlserver/sql-server-cursor-alternatives ),在 while 循环中我们获取每个列变量,对于列大于 10 的表会很乏味. 那么,我还有其他选择吗?

标签: sqlsql-server

解决方案


您可以创建一个存储过程并像下面的代码一样传递您的参数:

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

首先更新现有记录,然后插入新行。


推荐阅读