我在SQL Server中有一个触发器,它需要在更新时检查具有一定数量值的行数并相应地执行某些操作。我目前的代码是这样的:
IF EXISTS(SELECT COUNT(id) as NumberOfRows
FROM database
WHERE id = 3 AND value <= 20 and value > 2
GROUP BY id
HAVING COUNT(id) > 18)
-- if true, do something
据我所知,select语句应该找到值在2到20之间的行数,如果有超过18行,EXISTS
函数应该返回1并且查询将执行IF语句中的代码。
然而,正在发生的事情是它始终在IF语句中执行代码,而不管值在2到20之间的行数。
关于为什么会出现这种情况的任何想法?如果可能有帮助,我可以发布更完整的代码。
答案 0 :(得分:1)
原因是Exists
函数正在检查existing
的子查询结果 - 是否存在任何行。并且,当您返回COUNT
时,如果数据库中没有显示任何行,那么它永远不会存在 - COUNT
会返回0
。
尝试将结果计数存储在局部变量中,如此问题:
Using IF ELSE statement based on Count to execute different Insert statements
DECLARE @retVal int SELECT @retVal = COUNT(*) FROM TABLE WHERE COLUMN = 'Some Value' IF (@retVal > 0) BEGIN --INSERT SOMETHING END ELSE BEGIN --INSERT SOMETHING ELSE END
答案 1 :(得分:0)
您的子查询正在整个表中查找匹配项。它不会仅将结果限制为与受更新影响的行相关的结果。因此,如果表中已有符合条件的行,则在影响其他行的任何更新中,条件都将为真。
为了只计算相关行,您应该将database
表加入inserted
伪表,或者使用 inserted
表(你的问题中没有足够的信息可以确定哪个更好)。
答案 2 :(得分:0)
我会这样(单行):
IF ((SELECT COUNT(id) FROM table WHERE ....)>18) BEGIN
...do something
您甚至可以在一行之间进行操作
IF ((SELECT COUNT(id) FROM table WHERE ....)between 2 and 20) BEGIN
...do something
END