将新数据插入SQL Server表时出现问题

时间:2013-11-13 09:44:41

标签: sql sql-server tsql

我正在尝试从另一个表(表类型)插入一个if else表。

我遇到了问题,基本上第一次运行脚本时,它会将所有数据添加到表中,但是如果事后添加了一些内容,则不会添加新记录,我不知道原因。

我无法包含确切的代码,但它看起来像这样......

UPDATE CUSTOMER
Set Target.Desc = Source.Desc
From @source source
WHERE Target.AccountNumber = Source.AccountNumber

IF @@ROWCOUNT=0
   INSERT INTO CUSTOMER(AccountNumber, Desc)
      SELECT Source.AccountNumber, Source.Desc
      FROM @Source Source

我也尝试了传统的if else插入,但结果相同。

你能看到任何可能阻止插入新添加记录的错误吗?

5 个答案:

答案 0 :(得分:2)

如果@source包含所有现有行或所有新行,则您当前的代码才能正常运行。

如果不是这种情况,您可以使用MERGE

MERGE CUSTOMER AS target
USING @source AS source
ON ( target.AccountNumber = source.AccountNumber )
WHEN MATCHED THEN
  UPDATE SET [Desc] = source.[Desc]
WHEN NOT MATCHED THEN
  INSERT (AccountNumber, [Desc])
  VALUES (AccountNumber, [Desc]); 

答案 1 :(得分:0)

如何做而不是使用@@ ROWCOUNT

-- update existing customers
UPDATE c
SET c.Desc = Source.Desc
FROM @source source
INNER JOIN CUSTOMER c ON c.AccountNumber = Source.AccountNumber

-- insert new customers
INSERT INTO CUSTOMER(AccountNumber, Desc)
SELECT Source.AccountNumber, Source.Desc
FROM @Source Source
LEFT JOIN CUSTOMER c ON Source.AccountNumber = c.AccountNumber
WHERE c.AccountNumber IS NULL

答案 2 :(得分:0)

@@ ROWCOUNT值包含受影响的行数。只有当所有记录都是新记录时,insert语句才有效。并且它不会用于更新。如果任何记录得到更新,即使源包含新记录也不会插入

如果您的要求是更新现有记录并从源代码插入新记录,则可以使用以下代码。

-- update existing Rows
UPDATE CUSTOMER 
SET CUSTOMER.Desc = SOURCE.Desc
from @SOURCE Source
WHERE Source.AccountNumber=CUSTOMER.AccountNumber

-- Insert New Data
INSERT INTO CUSTOMER (AccountNumber, Desc)
SELECT s.AccountNumber, s.Desc
FROM @Source Source
WHERE not exists( SELECT 1
                  FROM CUSTOMER 
                  WHERE CUSTOMER.AccountNumber=Source.AccountNumber)

答案 3 :(得分:0)

-- update all existing rows
update c set 
    c.Desc = s.Desc
from CUSTOMER c
join @source s on s.AccountNumber=c.AccountNumber

-- insert all missing rows
insert into CUSTOMER (AccountNumber, Desc)
select s.AccountNumber, s.Desc
from @Source s
where not exists(
    select *
    from CUSTOMER c
    where c.AccountNumber=s.AccountNumber
)

答案 4 :(得分:0)

第一次,您的目标中没有数据,因此@@ rowcount为0。 下次更新将更新所有数据,@@ rowcount不为0,并且您没有插入数据。 你不应该使用@@ rowcount但是要做安德鲁建议:做UPDATE和INSERT 或MERGE(在一个声明中同时执行)