2015-06-19 71 views
0

我寫了一個光標來查看查看一個位值的表。 如果所有值都是1,我會發送一封電子郵件。但是如果任何一行中的值爲0,我不會發送電子郵件。我遇到的問題來自我的If語句。在SSMS中,「@isComplete = 0」只會打破「錯誤的語法」錯誤。我不知道我在這裏失去了什麼。我的代碼如下。謝謝。如果在光標返回位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 -- 
------------------------------------------------- 

回答

1

不正確的語法,你需要使用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 
+0

謝謝你做到這一點。這完全回答了我的問題。我擺脫了光標。謝謝。 – joerdie

1

語法錯誤的結果是沒有語句就行。您需要使用SET或SELECT來爲變量賦值,例如set @isComplete = 0

爲什麼祈禱告訴遊標而不是簡單的EXISTS查詢?一個更有效的解決方案是:

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

提示:這是有幫助的標記同時與相應的軟件數據庫的問題(MySQL和甲骨文,DB2,...)和版本,例如SQL服務器2014。語法和功能的差異往往會影響答案。