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