0

あるテーブルから別のテーブル (テーブル タイプ) に 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 挿入も試しましたが、結果は同じでした。

新しく追加されたレコードの挿入を妨げている可能性のある問題が何かわかりますか?

4

5 に答える 5

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]); 
于 2013-11-13T10:12:33.380 に答える
0

@@ROWCOUNT 値には、影響を受ける行の数が含まれます。挿入ステートメントは、すべてのレコードが新しい場合にのみ機能します。それは更新に行きません。いずれかのレコードが更新された場合、ソースに新しいレコードが含まれていても挿入されません

要件が既存のレコードを更新し、ソースから新しいレコードを挿入することである場合は、次のコードを使用できます。

-- 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)
于 2013-11-13T10:07:03.733 に答える
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
于 2013-11-13T09:59:45.203 に答える
0

最初は、ターゲットにデータがないため、@@rowcount は 0 です。次回は、更新によってすべてのデータが更新され、@@rowcount が 0 ではなく、データが挿入されません。@@rowcount を使用するべきではありませんが、Andrew が提案することを行う必要があります。UPDATE と INSERT または MERGE の両方を実行します (両方を 1 つのステートメントで実行します)。

于 2013-11-13T10:14:36.950 に答える
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
)
于 2013-11-13T10:13:30.440 に答える