2016-12-05 101 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 

問題:表更新數據,但似乎我每次運行只在有記錄的更新,而不是時間更新了一切。例如,當我運行上面的查詢時,我得到了(10 row(s) affected)消息,當我再次運行時,我應該得到(0 row(s) affected),因爲表已經更新並且IF語句不應該得到任何結果。

我嘗試以下選項,以及:

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似乎是你正在尋找的東西,但我不確定你爲什麼期望第一個命令的第二次運行不會更新任何東西...... – scsimon

+0

如果你只是運行這個,會發生什麼:「UPDATE A SET ProductID = 123 FROM TableA A INNER JOIN TableB B ON A.ProductID = B.ProductID AND B.ProductID <> 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