Sql 游标循环不工作。仅获取参数中的最后一个值?

Sql 游标循环不工作。仅获取参数中的最后一个值?,sql,sql-server,sql-server-2005,sql-server-2008,tsql,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 M

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

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

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
现在,当我执行类似exec[dbo].[Testing]'美国、日本、法国'

它只是给我法国的唱片


有人能帮我找出哪里错了吗?

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

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


将else子句更改为
SET@sql=@sql+…

现在,当我在ssrs报告中使用此过程时,它不会为我提供多个值的记录。找到了解决方案。只是想对你的方法做点改变。如果你不想有突破性的结果,那么就这么做吧。我按照你说的做了改变。但在报告中,此存储过程不起作用。我应该在进程中进行任何其他更改,以便将多个数据库的记录合并到一个结果中。谢谢