2011-07-12 57 views
2

這裏變量賦值是一個存儲過程,我想在SQL Server寫的簡化版本,2005年SQL Server 2005中有條件SP

我的問題是這樣的:

我已經聲明的變量@docid到我想在我的遊標中迭代查詢的結果時,如果沒有完全匹配,那麼我想運行另一個查詢並嘗試下一個最佳匹配。

我試過在IF @docid IS NULL then BEGIN [second query]的測試中。這是行不通的,因爲變量@docid不會是Null它只會保留先前的值,直到第一個查詢的條件滿足並且它被分配一個新值。

所以我該怎麼說:「如果我嘗試爲變量@docid分配一個docid,但沒有根據查詢中的條件進行匹配,那麼請運行下一個查詢或set @docid=''"?任何幫助,將不勝感激。由於

declare @docid bigint, 
     @account varchar(30) 

While @@fetch_status=0 
BEGIN 
    Select @Docid=Docid 
    FROM printdata 
    WHERE [email protected] 

    IF @docid Is Null --Docid Is never Null once assigned a value 
    BEGIN 
    Select @Docid=Docid 
    FROM printdata 
    WHERE [email protected] 
    END 
+2

你確定你需要使用遊標是什麼?你正在嘗試在更高層面上做什麼? –

+0

我從先前創建的臨時表中提取數據,並將其與另一個表中的Docid信息組合,然後將其插入兩個新表中。所以我正在用光標經過我的臨時表1的行1。 – cloud311

+0

從這個描述中,我想我們可以找到一個沒有光標的解決方案......這可能是一個更快/更簡單的解決方案。我可不可以要求你編輯你的問題,包括你開始使用的臨時表,以及你最終希望插入到兩個新表中的內容? –

回答

3

嘛,我只想先初始化@docid爲NULL - 那麼如果沒有找到爲NULL:

declare @docid bigint, 
     @account varchar(30) 

While @@fetch_status=0 
BEGIN 
    SET @docid = NULL 

    SELECT @Docid = Docid 
    FROM printdata 
    WHERE Account = @account 

    IF @docid IS NULL -- @Docid *WILL* be NULL now if nothing is found! 
    BEGIN 
    SELECT @Docid = Docid 
    FROM printdata 
    WHERE balance = @balance 
    END 
+1

+1 - 比我把解決方案放在光標末尾更有意義 – JNK

+0

@marc_s感謝您的建議,但問題在於此。它通過一次循環並得到值123,然後再次通過循環,發現沒有匹配,所以它仍然具有123的值,直到它第三次通過循環並且找到匹配並且現在被賦值如果沒有匹配,我想運行一個不同的查詢,而不僅僅是保留具有不正確的值123的變量。 – cloud311

+1

@ cloud311:不,不是真的 - 每當你經過循環,「@ docid」都是**第一**初始化爲空....或者我錯過了什麼...... –