Переменные таблицы внутри цикла while не инициализируются каждый раз: SQL Server - PullRequest
5 голосов
/ 20 сентября 2010

Мне интересно, почему переменные таблицы внутри цикла while не ведут себя как другие переменные. Табличные переменные создаются только один раз и будут использоваться в течение всего цикла. но другие переменные инициализируются каждый раз, когда цикл увеличивается.

Проверьте код ниже для получения дополнительной информации

declare @tt int
set @tt =10
while @tt>0
begin

        declare @temptable table(id int identity(1,1),sid bigint)
        insert into @temptable 
                select @tt union all
                select @tt + 1 

                select * from @temptable 
               --delete from @temptable
                set @tt=@tt-1
end

это ошибка ??

Ответы [ 4 ]

5 голосов
/ 20 сентября 2010

Ваша предпосылка неверна. Другие переменные не переинициализируются каждый раз, когда встречается оператор объявлений.

set nocount on

declare @tt int
set @tt =10
while @tt>0
begin

        declare @i int

        set @i = isnull(@i,0) + 1
        print @i
        set @tt=@tt-1

end

Печать

1
2
...
9
10
4 голосов
/ 20 сентября 2010

Как и ожидалось

Область переменных SQL Server указана для пакета или всей функции / процедуры / триггера, а не для черной / вложенной конструкции

http://msdn.microsoft.com/en-us/library/ms187953.aspx:

Область действия переменной - это диапазон операторов Transact-SQL, которые могут ссылка на переменную. Сфера переменная длится с того момента, как это объявлено до конца партии или хранимая процедура, в которой это объявлено.

0 голосов
/ 25 мая 2017

Если вы хотите загружать табличную переменную каждый раз, когда выполняется цикл. DROP FROM @Tablevariable после выполнения работы в цикле.

0 голосов
/ 10 июля 2015

Хотя это старый пост, просто хочу добавить мои комментарии

set nocount on
declare @tt int
set @tt =10
while @tt>0
begin
        declare @i int=0
        set @i = @i + 1
        print @i
        set @tt=@tt-1
end

Results:
1
1
1
1
1
1
1
1
1
1
...