首先设计表格并添加新字段。
或者运行
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