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的方法。