如何更新另一个表中的字段

时间:2013-08-07 19:11:08

标签: tsql sql-server-2012-express

我有两个表具有相同的数据和字段,除了一个。我想更新缺少字段'SBCMP'的表。以下是我要将字段和数据添加到的表的定义:

[dbo].[SalesData](
    [SBLOC] [varchar](3) NULL,
    [SBCUST] [varchar](7) NULL,
    [RMNAME] [varchar](30) NULL,
    [IFPRVN] [varchar](6) NULL,
    [SBITEM] [varchar](25) NULL,
    [SBITD1] [varchar](50) NULL,
    [SBDIV] [smallint] NULL,
    [SBCLS] [smallint] NULL,
    [SBQSHP] [smallint] NULL,
    [AVC] [real] NULL,
    [SBEPRC] [real] NULL,
    [SBINV] [int] NULL,
    [SBORD] [int] NULL,
    [SBTYPE] [varchar](1) NULL,
    [SBINDT] [datetime] NULL,
[RMSTAT] [varchar](2) NULL

另一个表具有完全相同的表定义,除了它有[SBCMP] [smallint] NULL

字段

我只是使用新表,但旧表有其他旧数据,而新表没有。

我只是想知道UPDATE的最佳方法是为表添加字段和数据。

1 个答案:

答案 0 :(得分:2)

首先设计表并添加新字段。

或运行

ALTER TABLE SalesData
ADD SBCMP smallint NULL

然后你可以使用MERGE来获取数据。

MERGE SalesData AS target
USING (SELECT * FROM SalesDataNew) AS source 
      ON (target.IDField = source.IDField )
WHEN MATCHED THEN 
    UPDATE SET SBLOC = source.SBLOC,
               SBCUST = source.SBCUST ,
               RMNAME = source.RMNAME,
               IFPRVN = source.IFPRVN ,
               SBITEM = source.SBITEM ,
               SBITD1 = source.SBITD1 ,
               SBDIV = source.SBDIV ,
               SBCLS = source.SBCLS ,
               SBQSHP = source.SBQSHP ,
               AVC = source.AVC,
               SBEPRC = source.SBEPRC,
               SBINV = source.SBINV ,
               SBORD = source.SBORD,
               SBTYPE = source.SBTYPE,
               SBINDT = source.SBINDT,
               RMSTAT = source.RMSTAT ,
               SBCMP = source.SBCMP
WHEN NOT MATCHED THEN   
    INSERT (SBLOC,
               SBCUST ,
               RMNAME,
               IFPRVN ,
               SBITEM ,
               SBITD1 ,
               SBDIV  ,
               SBCLS  ,
               SBQSHP ,
               AVC ,
               SBEPRC ,
               SBINV ,
               SBORD,
               SBTYPE,
               SBINDT,
               RMSTAT,
               SBCMP )
    VALUES (source.SBLOC,
               source.SBCUST ,
               source.RMNAME,
               source.IFPRVN ,
               source.SBITEM ,
               source.SBITD1 ,
               source.SBDIV  ,
               source.SBCLS  ,
               source.SBQSHP ,
               source.AVC ,
               source.SBEPRC ,
               source.SBINV ,
               source.SBORD,
               source.SBTYPE,
               source.SBINDT,
               source.RMSTAT
               source.SBCMP)

请记住,我在MERGE的ON子句中使用了一个名为IDField的虚构字段。这是虚构的,因为不清楚哪个是表的id。如果有两列形成id,你应该像在JOIN语句中那样添加它们。

还有一点是我将新表命名为SalesDataNew,因为我不知道它的实际名称。

MERGE是FULL OUTER加入两个表(称为目标和源)。然后,对于匹配的行,它正在执行UPDATE,对于源上而不是目标上的不匹配的行,它执行INSERT。 UPDATE和INSERT都在目标上执行。

当目标上有行但在源上没有(在这里你通常会删除)时,可以在目标上执行某些操作,但这超出了我认为的范围。

如果您只是想更新而不是INSERT,那么上面的内容对你来说没问题(虽然你应该删除当时没有匹配的部分。你也可以直接更新。

一个例子是:

UPDATE     SalesData
SET        SBLOC = source.SBLOC,
           SBCUST = source.SBCUST ,
           RMNAME = source.RMNAME,
           IFPRVN = source.IFPRVN ,
           SBITEM = source.SBITEM ,
           SBITD1 = source.SBITD1 ,
           SBDIV = source.SBDIV ,
           SBCLS = source.SBCLS ,
           SBQSHP = source.SBQSHP ,
           AVC = source.AVC,
           SBEPRC = source.SBEPRC,
           SBINV = source.SBINV ,
           SBORD = source.SBORD,
           SBTYPE = source.SBTYPE,
           SBINDT = source.SBINDT,
           RMSTAT = source.RMSTAT ,
           SBCMP = source.SBCMP
FROM       SalesData target
           JOIN SalesDataNew source
               ON target.IDField = source.IDField