我正在浏览我们的代码库并看到很多像这样的测试:
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
函数,但这里的目标是获取行的某些属性并同时检查它是否存在。
答案 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时,这是一种常见的模式。