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

Sql 检查@rowcount函数以确定行的存在是否可以?,sql,sql-server,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语句中

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

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,所以上面的内容不会影响它,整个答案可以压缩为Yes

是的。这是处理时的常见模式。

仅适用于低容量,是的

您最好尝试在出现错误时插入并更新。可以使用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
编辑:

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


是的,但是您必须在表上保持更新锁,否则您的代码不是线程安全的。这两个系统都需要。什么是。。。处理不存在的情况吗?@Martin。在某些情况下RAISERROR,在其他情况下返回特定的退出代码,但在其他情况下插入一行,不一定在原始表中。。。处理不存在的情况正在做。他们说这里的目标是获取行的一些属性,同时检查它的存在。如果不存在,则不插入。如果我需要追加插入,select和insert/update是否需要在事务中?@Alexander-啊,如果您确实需要追加插入,那么我建议gbn的方法。