0

I have two tables that have the same data and fields except for one. I want to UPDATE the table that is missing the field 'SBCMP'. Here is the definition of the table I want to add the field and data to:

[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

The other table has the exact same table definitions except it has the field [SBCMP] [smallint] NULL

I would just use the new table, but the old table has other older data that the new one does not.

I just want to know what is the best method of UPDATE for the table to add the field and data.

4

1 回答 1

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 JOINning 两个表(称为目标和源)。然后,对于匹配的行,它执行一个 UPDATE,而对于在源上而不是在目标上的不匹配的行,它执行一个 INSERT。UPDATE 和 INSERT 都在目标上执行。

当目标上有行但源上没有行时,可以在目标上做一些事情(在这里你通常删除),但我相信这超出了范围。

如果您只想更新而不是插入,那么上面的内容对您来说是可以的(尽管您应该删除 WHEN NOT MATCHED THEN 部分。您也可以直接进行更新。

一个例子是:

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
于 2013-08-07T19:13:23.457 回答