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