2016-12-05 9 views
0

いくつかの基準に基づいてテーブルを更新しています。その基準に対応する行がある場合にのみテーブルを更新する必要があります。ここに私のコードの例です:のみ行があり、更新されたものを表示するときにテーブルを更新する

IF EXIST (SELECT COUNT(*) FROM TableA INNER JOIN TableB 
ON TableA.Product_ID = TableB.ProductID 
WHERE TableA.ProductID = 143) 

BEGIN 

UPDATE TableA 
SET A.ProductID = 123 
FROM TableA INNER JOIN TableB ON TableA.ProductID = Table.ProductID 
WHERE TableA.ProductID = 143 

END 

ISSUE:表は、データを更新しますが、すべて私はレコードがある場合にのみ更新するのではなく、実行するたびに更新しているようです。たとえば、上記のクエリを実行すると、(10 row(s) affected)というメッセージが表示されます。再度実行すると、テーブルが既に更新されており、IFステートメントで結果が得られないため、(0 row(s) affected)を取得する必要があります。

私は同様に、以下のオプションを試してみました:

IF (SELECT COUNT(*) FROM TableA INNER JOIN TableB 
ON TableA.Product_ID = TableB.ProductID 
WHERE TableA.ProductID = 143) >0 

BEGIN 

UPDATE TableA 
SET A.ProductID = 123 
FROM TableA INNER JOIN TableB ON TableA.ProductID = Table.ProductID 
WHERE TableA.ProductID = 143 

END 

問題:上記のクエリのみCommand(s) completed successfullyを返します。結果として更新される行数が必要です。どうすればそれを達成できますか?

+0

TableBにProductID = 123の行がありますか? – DVT

+1

@@ ROWCOUNTはあなたが探しているものだと思われますが、最初のコマンドの2回目の実行で何も更新されないと期待している理由はわかりません。 – scsimon

+0

これを実行するとどうなりますか: "UPDATE A SETプロダクトID = 123 テーブルからA内部結合テーブルB B A.プロダクトID = B.プロダクトIDおよびB.プロダクトID <> 123; – DVT

答えて

0

あなたが正しくしたいものを推測すれば、おそらくあまり複雑でない方法です。

IF EXISTS (SELECT * FROM TableB WHERE ProductID = 143) 
BEGIN 
UPDATE TableA 
SET ProductID = 123 
WHERE ProductID = 143; 

SELECT @@ROWCOUNT; 
END; 
0

問題はCOUNT(*)です。行がない場合でも、0が返されますが、実際には(常に)が存在します。あなたは単にそれを*と置き換える必要があります。

EXISTSのため、SQL Serverのオプティマイザが最初のレコードで停止する可能性があります(潜在的に両方を高速化して動作させる)

EXISTSのために、オプティマイザは*の拡張を気にしないことも知っています。

IF EXISTS (SELECT * 
      FROM TableA 
     INNER JOIN TableB ON TableA.Product_ID = TableB.ProductID 
      WHERE TableA.ProductID = 143 
     ) 
BEGIN 

    <your update statement>; 

    SELECT @@rowcount; -- or "RETURN @@rowcount;" whatever is appropriate to your use case 

END 
関連する問題