Tsql 如果游标返回0位,如何分配变量

Tsql 如果游标返回0位,如何分配变量,tsql,cursor,Tsql,Cursor,我已经编写了一个游标来搜索表中的一位值。 如果所有值均为1,我将发送电子邮件。但如果任何一行中有一个值为0,我就不发送电子邮件。我的问题出现在我的If声明中。在SSMS中,“@isComplete=0”正在中断,只出现“语法错误”错误。我不确定我在这里错过了什么。我的代码如下。多谢各位 ------------------------------------------------- -- Start the INNER Cursor -- ---------------------------

我已经编写了一个游标来搜索表中的一位值。 如果所有值均为1,我将发送电子邮件。但如果任何一行中有一个值为0,我就不发送电子邮件。我的问题出现在我的If声明中。在SSMS中,“@isComplete=0”正在中断,只出现“语法错误”错误。我不确定我在这里错过了什么。我的代码如下。多谢各位

-------------------------------------------------
-- 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

请问,为什么是游标而不是简单的查询?更有效的解决方案是:

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

假设您想在发现不完整的内容后立即退出,您应该将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

非常感谢。这完全回答了我的问题。我正在摆脱光标。谢谢
DECLARE @isComplete Bit = 1
SELECT @isComplete = 0 FROM #AAEAPVS WHERE Complete = 0