游标循环不起作用。只在参数中取最后一个值?

时间:2011-11-30 19:32:30

标签: sql sql-server sql-server-2005 sql-server-2008 tsql

我创建了存储过程,以便用户可以将多个逗号分隔值选择为单个参数。

这里我在循环这些值时遇到了一些问题。这是代码

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]。[测试]'美国,日本,法国'

它只给了我法国的记录。

有人可以在我错的地方帮助我。?

2 个答案:

答案 0 :(得分:1)

好吧,我可以看到一些奇怪的逻辑,比如if @sql = '';但是你的错误的原因只是你要覆盖yor @sql变量,所以当你执行它时,它只返回光标检索的最后一个国家的值。

答案 1 :(得分:1)

我不推荐这种方法,但如果仔细观察,你会发现你永远不会附加到@sql,只是分配给它。

将您的else子句更改为SET @sql = @sql + ...