我正在浏览我们的代码库,看到很多这样的测试:

declare @row_id int = ...
declare @row_attribute string

select
  @row_attribute = ROW_ATTRIBUTE
from
  SOME_TABLE
where
  ROW_ID = @row_id

if @row_attribute is null
begin
  ... handle not existing condition
end

这是问题,将 if 语句中的条件替换为:
if @@rowcount = 0
begin
  ... handle not existing condition
end

我知道 exist 函数,但这里的目标是获取行的一些属性并同时检查它的存在。

最佳答案

是的。

除非 WHERE 子句不在 PK(或唯一索引)上,否则可能会返回多于一行,但这无论如何都可能是一个错误。在这种情况下,变量会被反复重新分配,其最终值将取决于计划。

DECLARE @row_attribute INT

select
  @row_attribute = object_id
from
  sys.objects /*<--No WHERE clause. Undefined what the
                   final value of @row_attribute will be.
                   depends on plan chosen  */


SELECT @row_attribute, @@ROWCOUNT

编辑。 刚刚注意到您提议的测试是 if @@rowcount = 0 而不是 if @@rowcount <> 1,因此上述内容不会影响它,整个答案可以浓缩为"is"这个词!

关于sql - 检查@@rowcount 函数以确定行是否存在可以吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5504167/

10-10 12:26