可以检查@@ rowcount函数来确定是否存在行?

时间:2011-03-31 17:55:27

标签: sql sql-server

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

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函数,但这里的目标是获取行的某些属性并同时检查它是否存在。

3 个答案:

答案 0 :(得分:6)

除非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,因此以上内容不会影响它,整个答案可以缩写为“是” !

答案 1 :(得分:4)

仅限低音量,是

最好在出错时尝试INSERT和UPDATE。您可以使用OUTPUT子句

指定值
DECLARE @stuff TBLE (...)
BEGIN TRY
   ...
   BEGIN TRY
      INSERT table1
      OUTPUT ...
      VALUES ...()
   END TRY
   BEGIN CATCH
      IF ERROR_NUMBER = 2627
          UPDATE table1
          SET ...
          OUTPUT ...
      ELSE
         RAISERROR ...
   END CATCH
   ...
END TRY
BEGIN CATCH
   ...
END CATCH

编辑:

我的其他几个答案:希望你明白了。

答案 2 :(得分:1)

是。处理upserts时,这是一种常见的模式。