2015-12-15 8 views
1

Выполняю сценарий ниже.Работа таблицы Temp в SQL Server 2008 R2

declare @id int = 0 

while(@id < 10) 
begin 
    declare @tbl as table (id int) 

    insert into @tbl values(@id) 
    set @id = @id + 1 

    SELECT * FROM @tbl 
end 

Я получаю результат, как показано ниже.

Result

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

Я не понимаю этого поведения таблицы темп, пожалуйста, предложите.

+0

Ваш скрипт предоставит все строки, вставленные в таблицу, так как вы используете select * из таблицы –

+0

Возможный дубликат [Переменные таблицы внутри цикла while не инициализируются каждый раз: SQL Server] (http://stackoverflow.com/questions/ 3751096/table-variables-inside-while-loop-not-initializing-everytime-sql-server) – lad2025

ответ

2

В соответствии с Transact-SQL Variables:

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

Каждый DECLARE только "читать" один раз:

  • SQL Server PARCE код и прочитать все DECLARE заявления во время компиляции.
  • Затем он резервирует память для этих переменных.
  • Код может затем использовать их с места их уважения DECLARE до конца сценария.

Если мы посмотрим на ваш скрипт, @tbl уже зарезервирован в памяти, когда выполняется строка 1, но переменная может использоваться только после того, как скрипт достиг линии 5. Однако он не сохраняется снова и снова на каждом итерация цикла.

+0

нормально, но когда система выполняет второй блок, как система знает, что существует уже временная таблица с именем @tbl и он уже содержит значение 0 там –

+1

Поскольку вы используете переменную таблицы, а переменные вообще зарезервированы во время компиляции до начала запуска. –

+1

, то на второй итерации он не должен генерировать исключение. Как уже объявлено имя переменной '@tbl'? –

Смежные вопросы