Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 如果sql server 2005中的原始表中不存在,则从一个表更新到另一个表_Sql Server 2005_Insert_Exists - Fatal编程技术网

Sql server 2005 如果sql server 2005中的原始表中不存在,则从一个表更新到另一个表

Sql server 2005 如果sql server 2005中的原始表中不存在,则从一个表更新到另一个表,sql-server-2005,insert,exists,Sql Server 2005,Insert,Exists,我有两个具有相同列的表-T1,T2。我想根据键列从T2中存在的列更新表T1列:如果键列存在,则从T2更新T1的其余列;如果不存在,则将整行从T2插入T1 此查询不起作用: IF EXISTS (SELECT keyC FROM T2 WHERE keyC in (select keyC from T1)) UPDATE T1 SET T1.c1 = T2.c1, T1.c2 = T2.c2, from T2 WHERE T2.keyC in (select keyC from T1) EL

我有两个具有相同列的表-T1,T2。我想根据键列从T2中存在的列更新表T1列:如果键列存在,则从T2更新T1的其余列;如果不存在,则将整行从T2插入T1

此查询不起作用:

IF EXISTS (SELECT keyC FROM T2 WHERE keyC in (select keyC from T1)) 
UPDATE T1 SET T1.c1 = T2.c1,
T1.c2 = T2.c2,
from  T2 WHERE  T2.keyC in (select keyC from T1)
ELSE (INSERT INTO T1 select * from T2)
知道怎么修吗

提前感谢,


Greg

对于SQL Server 2008,请看一下使用该语句

MERGE T1 AS target
USING T2 AS source
ON (target.keyC = source.keyC)
WHEN MATCHED THEN 
    UPDATE SET c1 = source.c1, c2 = source.c2
WHEN NOT MATCHED THEN   
    INSERT (keyC, c1, c2)
    VALUES (source.keyC, source.c1, source.c2)
编辑:OP将问题从2008年更改为2005年

对于早期版本,您需要2个操作:

UPDATE target
    SET c1 = source.c1, c2 = source.c2
    FROM T1 AS target
        INNER JOIN T2 as source
            ON target.keyC = source.keyC

INSERT INTO T1
    (keyC, c1, c2)
    SELECT keyC, c1, c2
        FROM T2
        WHERE NOT EXISTS(SELECT NULL FROM T1 WHERE keyC = T2.keyC)

在SQL2008中,可以使用优雅的合并语句:

MERGE T1 AS target
USING T2 AS source ON (target.KeyC = source.KeyC)
WHEN MATCHED THEN 
    UPDATE SET  c1 = source.c1,
                c2 = source.c2
WHEN NOT MATCHED THEN   
    INSERT (c1, c2)
    VALUES (source.c1, source.c2);

因为您使用的是SQLServer2005,所以不能使用merge,必须执行两条语句。一次更新和一次插入

declare @T1 table (keyC int, c1 int)
declare @T2 table (keyC int, c1 int)

insert into @T1 values (1, 1)

insert into @T2 values (1, 10)
insert into @T2 values (2, 20)

-- Update all rows
update @T1 set
  c1 = T2.c1
from @T1 as T1
  inner join @T2 as T2
    on T1.keyC = T2.keyC

-- Insert new rows
insert into @T1 (keyC, c1)
select keyC, c1
from @T2 as T2
where not exists (select *
                  from @T1 as T1
                  where T1.keyC = T2.keyC)

由于不能在一条语句中执行,是否需要将其作为一条语句执行