2011-11-30 46 views
0

我創建了存儲過程,以便用戶可以將多個逗號分隔值選擇爲單個參數。光標循環不起作用。只取參數中的最後一個值?

這裏我在循環這些值時遇到了一些問題。這裏是代碼

Alter PROCEDURE [dbo].[Testing] @Databases varchar(4096) 
AS Begin 

    SET NOCOUNT ON; 

    Declare @cnt varchar(500) 
    Declare @sql varchar(Max) = '' 
    Declare @DB varchar(50) 

    ;WITH MyCTE 
     AS (SELECT * FROM [dbo].[fnSplitStringList] (@Databases)) 

    select * into #temp from MyCTE 

    DECLARE tenant_cursor CURSOR FOR 
     select * from #temp 
     OPEN tenant_cursor; 

    FETCH NEXT FROM tenant_cursor INTO @cnt; 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     select @DB = dbname from CountryLookup where dbName = @cnt 
     if @sql = '' 
     Begin 
      SET @sql = 'select C1, C2, C3 
       from ' + @DB + '.dbo.T1 
       inner join DB1.T2 on T1.C4 = T2.C4 
      ' 
     End 
     Else 
     Begin 
      SET @sql = 'select C1, C2, C3 
       from ' + @DB + '.dbo.T1 
       inner join DB1.T2 on T1.C4 = T2.C4 
      ' 
     End 
     FETCH NEXT FROM tenant_cursor INTO @cnt; 
    END 

    CLOSE tenant_cursor; 
    DEALLOCATE tenant_cursor; 

    Drop table #temp 
    exec (@sql) 

END 

現在,當我執行我的PROC象exec [DBO]。[測試]「美國,日本,法國

它只是讓我記錄了法國。

有人能幫我解決我錯的地方嗎?

回答

1

我不推薦這種方法,但如果仔細觀察,您會發現您永遠不會追加到@sql,只會分配給它。

將您的else子句更改爲SET @sql = @sql + ...

+0

感謝它的工作 – Ritesh

+0

現在,當我使用此proc到我的ssrs報告中時,它不會給我多個值的記錄。 – Ritesh

+0

得到了解決方案。只是想對你的方法做一點改變。如果你不想讓結果中斷,那麼就這樣做。 – Ritesh

1

那麼,我可以看到一些奇怪的邏輯,如if @sql = '';但是錯誤的原因很簡單,就是你覆蓋了變量,所以當你執行它時,它只會返回光標檢索到的最後一個國家的值。

+0

我按照你所說的做了修改。但在報告中這個存儲過程不起作用。 我應該在我的過程中對多個數據庫中的記錄進行任何其他更改。 謝謝 – Ritesh

相關問題