2012-12-19 25 views
4

我已經創建了一個存儲過程,它從表中特定列中檢索最後一個值,並根據文檔和位置的類型將其加1。嵌套存儲過程中的SQL變量

當我單獨調用此存儲過程時,它完美地工作。但是,當我將它嵌套在另一個存儲過程中時,該值未設置爲變量@TempLastGeneratedNumber。當我在另一個過程中調用存儲過程時,如果我打印@TempLastGeneratedNumber的值,它是空的。

但是,當我隔離調用存儲過程時,我得到正確的值。

這是我的存儲過程

Create Procedure [GenerateDocumentNo] 
     @Document_Type varchar(max) = null, 
     @Location_Id int = null 
     @FinalNumber varchar(max) = null output 
    as 
    begin try 
    begin tran 

    Declare @TempLastGeneratedNumber varchar(max) 

    if (@Document_Type = 'Apple') 
    BEGIN 
    Select top(1) @TempLastGeneratedNumber = Code from Apple_Details_tbl where Location_Id = @Location_Id order by Id desc 
    END 

    else if (@Document_Type = 'Mango') 
    BEGIN 
    Select top(1) @TempLastGeneratedNumber = Code from Mango_Details_tbl where Location_Id = @Location_Id order by Id desc 
    END 


    if(@TempLastGeneratedNumber is not null or @TempLastGeneratedNumber != '') 
    BEGIN 

    Set @FinalNumber = @TempLastGeneratedNumber + 1 
    END 

    commit tran 
    end try 

    begin catch 
    PRINT ERROR_MESSAGE() 
    if 
    end catch 

所以,請幫我有什麼問題,在上面的存儲過程,以及如何解決這個問題?

+0

*** SQL ***只是*結構化查詢語言* - 許多數據庫系統使用的語言,但不是數據庫產品......很多東西都是特定於供應商的 - 所以我們真的需要知道什麼* *你正在使用的數據庫系統**(和哪個版本).... –

+0

因此,你的'@ TempLastGeneratedNumber'的類型是'varchar(max)' - 然後你添加一個呢? '設置@FinalNumber = @TempLastGeneratedNumber + 1' - 這應該如何工作? –

+0

但我沒有得到TempLastGeneratedNumber的初始值,我從表中檢索它。選擇top(1)@TempLastGeneratedNumber =來自Apple_Details_tbl的代碼 – Uvraj

回答

1

最有可能的值爲NULL,因爲查詢沒有返回任何值或正在返回NULL值。

這可能是因爲@Document_Type既不是「蘋果」也不是「芒果」。或者,因爲location_id不在表格中。或者,因爲code上的最大id是NULL。

嘗試在調用過程時打印出參數的值。

另一種可能性是您沒有將@FinalNumber聲明爲調用的輸出參數以及定義。

我的確認爲將一個變量命名爲「無論NUMBER」,然後將其類型設置爲非數值是一種不好的做法。但是,我不這是造成你的問題。

+0

感謝您的快速建議Gordon Linoff。但我早些時候已經嘗試過了。我的@Document_Type既不爲空也不是我的代碼。我也曾宣佈FinalNumber作爲輸出在父存儲Procedure.However但我也認爲我的最大代碼爲空,但如果是這樣我已硬編碼到1.(修改其他條件中,我檢查TempDocumentNumber爲空或'') – Uvraj