我有两个表具有相同的数据和字段,除了一个。我想更新缺少字段'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的最佳方法是为表添加字段和数据。
答案 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