SQL Server - 存储过程(更新表) - 插入新行,更新现有行

时间:2016-09-15 22:45:01

标签: sql sql-server stored-procedures sql-update

我需要在一次操作中更新表中的几行。

我通常做的是删除(软删除)所有以前使用相同外键的记录并再次插入所有内容。但这根本不是最优的,现在我的工作实际上涉及必须创建存储过程,我想知道它有一种“标准”方式来执行这种操作。

以这些图片为例:

  1. 这是与外键(ParentId)1:

    关联的原始数据

    enter image description here

  2. 然后使用相应的界面进行以下更改:

    enter image description here

    a)在第二行中,列Name(黄色)已更改
    b)删除第三行(红色) c)第四和第五行(绿色)是新的。因为这些行仅驻留在客户端,所以我没有主键(Id)

  3. 这就是我想要的结果:

    enter image description here

  4. 到目前为止,我已经创建了一个新类型:

    IF EXISTS(SELECT * FROM sys.types WHERE name='T_DetailDomain') BEGIN
        DROP TYPE dbo.T_DetailDomain;
    END;
    GO
    
    CREATE TYPE dbo.T_DetailDomain AS TABLE
    (
        Id             INT NOT NULL,
        Name           VARCHAR (50)  NOT NULL,
        Abbrev         VARCHAR (300) NOT NULL,
        ParentId       INT NOT NULL 
    );
    GO
    

    这是程序的签名:

    CREATE PROC dbo.up_DetailDomain_Update 
        @pParentId  INT,
        @pTableDetail dbo.T_DetailDomain READONLY
    AS
    

    如您所见,我将所有行作为表值参数(@pTableDetail)传递。

    有没有“标准”的方法可以实现我上面描述的内容?

    或者我必须执行三项操作:

    1. 插入没有Id的所有行
    2. 使用现有ID更新所有行
    3. 删除表值参数中不存在Id的所有行?
    4. 感谢。

0 个答案:

没有答案