2010-09-20 12 views
5

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

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

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 @[email protected] 
end 

это ошибка ??

ответ

5

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

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 @[email protected] 

end 

Печать

1 
2 
... 
9 
10 
+1

спасибо за обновление .. я пропустил isnull при тестировании с переменной .., что привело к моему cofusion .. :( – RameshVel

4

Как и ожидалось переменная Объем

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

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

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

0

Хотя это старый пост только Wann добавить свои комментарии

 
set nocount on 
declare @tt int 
set @tt =10 
while @tt>0 
begin 
     declare @i int=0 
     set @i = @i + 1 
     print @i 
     set @[email protected] 
end 

Results: 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
-1

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

+0

Вы не можете удалить переменную таблицы вручную. –