更新了SQL条件INSERT

时间:2012-04-25 20:54:39

标签: sql insert sql-server-2008-r2

我遇到需要将数据从table1插入table2的情况。在插入之前检查table2中是否已经存在某个行,如果是,则只更新行的col2,col4。如果它不存在则插入一个新行。

我正在使用SQLSERVER 2008 R2。我怎么能实现这个目标?

现在情况发生了一些变化。我需要这样的东西。

DECLARE @table1 TABLE 
(id int not null, ahccs int not null, info varchar(25), flag varchar(2))
DECLARE @table2 TABLE 
(id int not null, ahccs int not null, info varchar(25), flag varchar(2))

INSERT INTO @table1
VALUES(1, 1223, 'et', 'X')
INSERT INTO @table1
VALUES(2, 321, 'et', 'X')
INSERT INTO @table1
VALUES(3, 134, 'et', 'X' )
INSERT INTO @table1
VALUES(4, 168, 'et', 'X' )
INSERT INTO @table1
VALUES(5, 123, 'et', 'X' )


INSERT INTO @table2
VALUES(1, 1223, 'dt', 'y' )
INSERT INTO @table2
VALUES(2, 456, 'dt', 'y' )
INSERT INTO @table2
VALUES(3, 123, 'dt', 'y' )
INSERT INTO @table2
VALUES(4, 193, 'dt', 'y' )
--SELECT * FROM @table1

SELECT * FROM @table2

MERGE
INTO    @table2 t2
USING   @table1 t1
ON      t2.id = t1.id or t2.ahccs = t1.ahccs
WHEN NOT MATCHED THEN
UPDATE
SET     flag = 'z'
INSERT VALUES (100, t1.ahccs, t1.info, 'l');

我遇到的两个问题是: 1)我认为合并不支持多个步骤。 2)在WHEN NOT MATCHED情况下不允许更新。

请告知。

谢谢。

2 个答案:

答案 0 :(得分:3)

您需要使用merge,它允许您将尝试更新或插入(“upsert”)的数据与当前表中的数据进行匹配,并根据状态执行不同的操作或没有匹配。

MERGE Stock S
USING Trades T ON S.Stock = T.Stock
WHEN MATCHED THEN
    UPDATE SET Qty += Delta
WHEN NOT MATCHED THEN
    INSERT VALUES (Stock, Delta);

此示例来自here

答案 1 :(得分:2)

MERGE
INTO    table2 t2
USING   table1 t1
ON      t2.id = t1.t2_id
WHEN NOT MATCHED THEN
INSERT  
VALUES  (t1.col1, t1.col2, ...)
WHEN MATCHED THEN
UPDATE
SET     col2 = t1.col2,
        col4 = t1.col4