如果 Cursor returns 位为 0,如何分配变量

How to assign variable if Cursor returns Bit of 0

我写了一个游标来搜索 table 查看一位值。 如果所有值都是 1,我会发送一封电子邮件。但是,如果任何一行中有一个值为 0,我就不会发送电子邮件。我遇到的问题出现在我的 If 语句中。在 SSMS 中,“@isComplete = 0”仅因 "Incorrect syntax" 错误而中断。我不确定我在这里错过了什么。我的代码如下。谢谢你。

-------------------------------------------------
-- Start the INNER Cursor --
-------------------------------------------------
DECLARE @Complete int

DECLARE @isComplete Bit = 1

DECLARE INNERCur CURSOR FOR
SELECT Complete 
FROM #AAEAPVS

OPEN INNERCur
FETCH NEXT FROM INNERCur INTO @Complete
WHILE @@FETCH_STATUS = 0
   BEGIN
      If @Complete = 0
          BEGIN
            @isComplete = 0
          END
      FETCH NEXT FROM INNERCur INTO @Complete
   END
CLOSE InnerCurs
DEALLOCATE InnerCurs
-------------------------------------------------
-- INNER Curser END --
-------------------------------------------------

行中没有语句导致语法错误。您需要使用 SET 或 SELECT 为变量赋值,例如set @isComplete = 0.

请告诉我,为什么是游标而不是简单的 EXISTS 查询?一个更有效的解决方案是:

select @isComplete = case
  when exists ( select 42 from #AAEAPVS where Complete = 0 ) then 0
  else 1 end;

提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。

不正确的语法是需要用SET给变量赋值,所以改

@isComplete = 0

SET @isComplete = 0

假设您想在发现未完成的内容后立即退出,您应该将 WHILE 条件更改为

WHILE @@FETCH_STATUS = 0 AND @isComplete = 1

但最重要的是,您可能根本不需要使用游标 - 如果可能,您应该避免在 SQL 中使用游标。你也许可以做这样的事情

DECLARE @isComplete Bit = 1
IF EXISTS (SELECT * FROM #AAEAPVS WHERE Complete = 0)
BEGIN
    SET @isComplete = 0
END

即使超出您的需要,您也可以在一条语句中完成

DECLARE @isComplete Bit = 1
SELECT @isComplete = 0 FROM #AAEAPVS WHERE Complete = 0