2011-01-28 130 views
0

這是我的存儲過程中正常工作的示例sql查詢。 但我想通過特許權,這是這裏的TH-003853199「和動態表名的值..存儲過程中的錯誤

SELECT @source = source,@stage = stage 
     FROM BABMwork8_22_1210_0012.dbo.concessions 
     WHERE concession = 'TH-003853199' 

和存儲過程,在查詢

ALTER PROCEDURE status_in_other_db 
        @other_db VARCHAR(50), 
        @concession VARCHAR(30) 
     AS 
    BEGIN 
      SET NOCOUNT ON 

     DECLARE @query VARCHAR(8000), 
       @other_db_con VARCHAR(80), 
       @source VARCHAR(10), 
       @stage VARCHAR(50), 
       @status_in_other_db VARCHAR(50) 

     SET @other_db_con = @other_db + '.dbo.concessions' ; 
     SET @query = ('SELECT @source = source,@stage = stage FROM ' + @other_db_con + ' WHERE concession = '''[email protected]+''' ') 
      EXEC(@query) 
     IF(@source!='PARK') 
    BEGIN 
     SET @status_in_other_db = 
     CASE @stage 
      WHEN 'Open' THEN 'Open' 
      WHEN 'Archive' THEN 'Archived' 
      WHEN 'R4invoicing' THEN 'Ready for invoicing' 
      WHEN 'N2Bdetermined' THEN'SplitBA' 
      WHEN 'Invoiced' THEN 'Invoiced' 
      WHEN 'Exclusion' THEN'Exclusion' 
     END 
    END 
ELSE IF(@source='PARK') 
    SET @status_in_other_db = 'PARK' 
ELSE IF(@source='') 
    SET @status_in_other_db = 'Not present' 

SELECT @status_in_other_db as status_in_other_db 
END 

編輯在這裏我想要返回@status_in_other_db的值,這應該是我的輸出參數。

執行此存儲過程時,出現錯誤: - 必須聲明@source標量變量。

Eventhough我修改,所以,現在我沒有得到任何錯誤訊息,也沒有結果...

SET @query = 'DECLARE @source VARCHAR(10), @stage VARCHAR(50) ' 

SET @query = @query + 'SELECT @source = source,@stage = stage 
    FROM BABMwork8_22_1210_0012.dbo.concessions 
    WHERE concession = ''TH-003853199'' ' 

請幫我

回答

2

您正在使用@query在分配給@Query

SET @query = @query + 'SELECT @source = source,@stage = stage 
    FROM BABMwork8_22_1210_0012.dbo.concessions 
    WHERE concession = ''TH-003853199'' ' 

由於@query未初始化@查詢爲空和你把你的SELECT語句@Query後將爲空。改爲此。

SET @query = 'SELECT @source = source,@stage = stage 
    FROM BABMwork8_22_1210_0012.dbo.concessions 
    WHERE concession = ''TH-003853199'' ' 

當你嘗試,你會得到錯誤信息

Must declare the scalar variable "@Source"

,因爲他們不是從EXEC範圍不能使用變量的動態SQL。正如gbn所說,你需要使用臨時表。使動態SQL對您以前在存儲過程中創建的臨時表執行插入操作。

create table #Temp (Source varchar(10), Stage varchar(50)) 

後執行的動態SQL可以從#TEMP

select @Source = Source, @Stage = Stage from #Temp 
+0

+1,Thanku verymuch分配@Source和@Stage。這就像一個魅力。我也很欣賞一步一步的程序:-) – satya 2011-01-28 12:36:19

1

執行動態查詢時@source不在範圍內。 AKA的動態查詢範圍與存儲過程範圍不同。

您必須使用臨時表將數據傳遞迴動態查詢。

雖然,我不知道爲什麼需要@Source反正:你不使用它

這個答案是受到有關SQL注入等常見的注意事項