如何在存储过程中执行多次更新?

时间:2018-11-06 06:56:28

标签: sql-server stored-procedures

我将根据模型列一起将table1的一些列和一些行更新到table2。

例如DATA1DB数据库中的table1

| id | name | address | color | model |
| 1    avi     aadd     blue     mod1
| 2    bref    ddff     red      mod2
| 3    cind    ffdd     red      mod1
| 4    davi    ffgg     green    mod1

DATA2DB数据库中的表2

| id | name | address | color | model |
| 1    avi     aadd     red      mod1
| 2    bref    dddd     red      mod2
| 3    cind    ffff     red      mod1
| 4    davi    gggg     red      mod1

当执行基于id =(1,3,4)的更新时,我希望table2与table1相同。 在我的存储过程中,我有此代码

ALTER PROCEDURE [dbo].[updatemultiple]
@id varchar (5)
AS BEGIN SET NOCOUNT ON
begin 
UPDATE  DATA2DB.table2
SET [DATA2DB].table2.address= [DATA1DB].table1.address,
    [DATA2DB].table2.color  = [DATA1DB].table1.color,
FROM [DATA2DB].table2
INNER JOIN [DATA1DB].table1
ON [DATA2DB].table2.id = [DATA1DB].table2.id
where LTRIM(RTRIM([DATA1DB].table1.id)) = LTRIM(RTRIM(@id))

我想要DATA2DB数据库中的结果表2

| id | name | address | color | model | 
  1     avi    aadd      blue    mod1 
  3    cind    ffdd      red     mod1 
  4     davi   ffgg     green    mod1

2 个答案:

答案 0 :(得分:1)

我假设您想在DB1更新时更新DB2。

如果是这样,则可以将更新触发器添加到DB1中的表中。

ALTER TRIGGER [dbo].[tr_UPDATE_DB2TABLE]
  ON [DATA1DB].table1
AFTER UPDATE
AS BEGIN
 SET NOCOUNT ON;

 UPDATE  DATA2DB.table2
 SET [DATA2DB].table2.address= [DATA1DB].table1.address,
    [DATA2DB].table2.color  = [DATA1DB].table1.color,
 FROM [DATA2DB].table2
 INNER JOIN Inserted I ON I.Id = [DATA1DB].table1.Id
 INNER JOIN [DATA1DB].table1 ON [DATA2DB].table2.id = [DATA1DB].table2.id
 where LTRIM(RTRIM([DATA1DB].table1.model)) = LTRIM(RTRIM(I.model))
END

每次DB1中的表更新时,都会更新DB2中的表。

答案 1 :(得分:0)

花点时间了解您的问题是什么... 如果我理解正确,那么您想使用@id =('1,3,4')

执行过程

然后,您要获取每个单个ID(1、3和4),并使用table1中的值对每个ID运行更新。如果这一切正确,您的sp可能如下所示:

ALTER PROCEDURE [dbo].[updateMultiple] @id VARCHAR(5)
AS
    BEGIN
        DECLARE @single_id INT;

        DECLARE my_cursor CURSOR
        FOR SELECT value
           FROM   STRING_SPLIT(@id, ',')
           WHERE  RTRIM(value) <> '';
        OPEN my_cursor;
        FETCH NEXT FROM my_cursor INTO @single_id;

        WHILE @@FETCH_STATUS = 0
        BEGIN
           UPDATE [db2]
            SET  
                [db2].[address] = [db1].[address], 
                [db2].[color] = [db1].[color]
           --    declare @id varchar(5) = (1,3,4);Select *
           FROM   [data2db] [db2]
                JOIN [data1db] [db1] ON [db2].[id] = [db1].[id]
           WHERE  [db1].[id] = @single_id;
           FETCH NEXT FROM my_cursor INTO @single_id;
        END;

        CLOSE my_cursor;
        DEALLOCATE my_cursor;

    END;
GO

您需要将输入字符串分割成每个单独的ID,然后执行更新。

这是可能的,但可能不是最好的方法...只是说...

希望有帮助。

PS:在我的示例中,我在同一个数据库中使用了两个表,但是它也应该在两个不同的数据库上工作。

编辑:或者它甚至可以在没有光标的情况下工作:

ALTER PROCEDURE [dbo].[updateMultiple] @id VARCHAR(5)
AS
    BEGIN
        UPDATE [db2]
         SET  
            [db2].[address] = [db1].[address], 
            [db2].[color] = [db1].[color]    
        --declare @id varchar(5) = '1,3,4';Select *
        FROM   [data2db] [db2]
             JOIN [data1db] [db1] ON [db2].[id] = [db1].[id]
        WHERE  [db1].[id] IN
        (
           SELECT value
           FROM   STRING_SPLIT(@id, ',')
           WHERE  RTRIM(value) <> ''
        );

    END;
GO