我正在尝试从另一个表(表类型)插入一个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插入,但结果相同。
你能看到任何可能阻止插入新添加记录的错误吗?
答案 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(在一个声明中同时执行)