gpt4 book ai didi

sql - 如何在 IF 语句以及 BEGIN..END block 中使用 @@ROWCOUNT?

转载 作者:行者123 更新时间:2023-12-02 09:55:03 25 4
gpt4 key购买 nike

我的代码如下:

SET @var = (SELECT var FROM dbo.varDB WHERE varName = @varName)

IF (@@ROWCOUNT > 0)
BEGIN
//carry out insert
END

我说得对吗?因为它最后执行分配,所以总是为 @@ROWCOUNT 返回 1 吗?

如果是这样,最优雅的解决方案是什么让我能够:

  • 创建变量,并将查询结果存储在其中
  • 测试查询是否返回任何结果

最佳答案

它返回 1 的原因是因为您只分配了一个值(某个任意值)。正如 @Sive 建议的那样,您应该使用 EXISTS 而不是进行手动计数。原因是 EXISTS 的性能不会比 COUNT 差,并且在您描述的用例中,实际计数是多少并不重要。您想知道计数是否为零或大于零。

按照您的方式将该值分配给变量的问题是,如果有多行匹配,会发生什么?让我们尝试一下:

DECLARE @foo TABLE([var] INT, varname SYSNAME);
INSERT @foo VALUES (1,N'bob'),(2,N'bob');
DECLARE @var INT;
SET @var = (SELECT [var] FROM @foo WHERE varname = N'bob

结果:

Msg 512, Level 16, State 1, Line 4
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

现在,如果 varname 是唯一的,我会这样做:

SELECT @var = [var] FROM dbo.varDB WHERE varName = @varName;
IF @var IS NOT NULL
BEGIN
// carry out insert
END
ELSE
BEGIN
PRINT 'Already existed! ' + RTRIM(@var);
END

如果varname不是唯一,那么我不确定您将如何处理单个值。拉的是哪一个?想象一下这个场景:

DECLARE @foo TABLE([var] INT, varname SYSNAME);
INSERT @foo VALUES (3,N'bob'),(2,N'adam'),(1,N'bob');
DECLARE @var INT;
SELECT @var = [var] FROM @foo WHERE varname = N'bob';
PRINT @var;

@var 是 1 还是 3?谁知道?如果您只捕获潜在的众多值之一,为什么选择哪一个很重要呢?您打算对该行执行某些操作而不是其他行吗?

此外,如果您的目的是从此表中插入数据,为什么不简单地放弃预先检查、行计数等,然后直接说:

INSERT dbo.SomeTable(column1 --,...other columns
SELECT var --,...other columns
FROM dbo.varDB
WHERE varName = @varName;

如果该行不存在,则不会发生插入。

关于sql - 如何在 IF 语句以及 BEGIN..END block 中使用 @@ROWCOUNT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10384963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com