SQL IF EXISTS行为怪异

时间:2018-06-07 23:50:51

标签: sql sql-server database

我正在改变一些存储过程,发生了一些奇怪的事情。

IF EXISTS (SELECT * FROM TABLE1
           WHERE varID = (CAST(@v_varID AS int) + 1))
    UPDATE TABLE2
    SET id = (CAST(@v_varID AS int) + 1) 
    WHERE category = @v_category 
ELSE
    UPDATE CATEGORY 
    SET id = (CAST(@v_varID AS int) + 1) 
    WHERE category = @v_category 

这是我的代码。由于@v_varID的类型为varchar,因此我需要将其转换为int才能增加id。问题是当@v_varID被转换时,它会被IF EXISTS捕获。当我在没有EXISTS的情况下更新它时,它就像我预期的那样工作。

ERROR_LOG显示表中的另一个不可转换的@v_varID无法转换为int。我一直只传递'800'或一些varchar-ed整数,所以它应该可以工作但不知何故它不会通过IF EXISTS(如果我摆脱IF EXISTS它会更新)。我只是用另一种方式使它工作,但我很好奇为什么。

谢谢!

1 个答案:

答案 0 :(得分:2)

您的update条件category = @v_category

您的if exists ()子查询没有。

我猜测varid是一个字符串。与整数的比较将varid转换为整数。

此外,我猜在转换之前正在检查类别。换句话说,有一个行v_varid值不正确(即无法转换为整数),而且这个行位于类别不匹配的行上。