Курсорная петля не работает.Только принимая последнее значение в параметре? - PullRequest
0 голосов
/ 30 ноября 2011

Я создал сохраненный процесс, чтобы пользователь мог выбрать несколько значений, разделенных запятыми, в один параметр.

Здесь я получаю некоторую проблему при циклировании этих значений.вот код

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]. [Тестирование] 'США, Япония, Франция'

Это только дает мне записи для Франции.

Может ли кто-нибудь помочь мне, где я не прав ??

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Я не рекомендую этот подход, но если вы посмотрите внимательно, вы увидите, что вы никогда не добавляете @sql, просто присваиваете ему значение.

Измените ваше предложение else на SET @sql = @sql + ....

1 голос
/ 30 ноября 2011

Ну, я вижу странную логику, например if @sql = ''; но причиной вашей ошибки является просто то, что вы перезаписываете переменную yor @sql, поэтому при ее выполнении она возвращает значения только для последней страны, которую получил курсор.

...