Допустим, у меня есть следующее:

--Section 1
SELECT * INTO #TEMP1 FROM TABLEA

--Section 2
/*more code here*/

--Section 3
SELECT * FROM #TEMP1

Во время обработки раздела 2 TABLEA существенно меняется. В Разделе 3 будет ли моя временная таблица возвращать результаты исходного SELECT INTO или теперь она будет возвращать текущие результаты из таблицы?

3
whatwhatwhat 20 Авг 2018 в 16:34

3 ответа

Лучший ответ

Как сказано в @TaPaKaHUA, данные в #TEMP1 не изменятся. Это сохраняется. Это не похоже на указатель в некоторых языках программирования, которые ссылаются только на область памяти. Вы можете легко это проверить, запустив select * from #TEMP1 до и после раздела 2 своего кода, и вы увидите, что данные идентичны. Вы захотите использовать order by, поэтому данные возвращаются в том же порядке, что облегчает сравнение. В противном случае данные будут или могут быть возвращены в произвольном порядке. Подробнее об этом в этом блоге, если вы заинтересованы.

1
scsimon 20 Авг 2018 в 13:53

Нет. Таблица представляет собой моментальный снимок, когда она создается - если вы явно не изменили содержимое с помощью DML («язык изменения данных», например insert, delete, update, truncate ) .

Если вы хотите что-то, что меняется с базовой таблицей, используйте представление:

create v_tableA as
    select a.* 
    from TABLEA a;

Это будет пересчитано при вызове, поэтому оно «меняется» с базовой таблицей (таблицами).

1
Gordon Linoff 20 Авг 2018 в 13:53

Временная таблица не имеет связи или «знания» о том, как она заполняется. Действительно, SELECT ... INTO - это всего лишь один способ заполнения временной таблицы. Он может быть заполнен несколькими различными операторами, иметь некоторые данные UPDATE d или DELETE d и т. Д.

Ему все равно, откуда пришли данные, он просто хранит строки, которые вы в него вставляете. В большинстве случаев это как любой другой стол.


Если вы хотите что-то, что «хранит» запрос, а не набор результатов (то есть, если вы хотели, чтобы оно всегда отражало текущее состояние), вы можете получить что-то подобное, определив курсор (с соответствующими параметрами, установленными так, чтобы это динамический курсор).

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

1
Damien_The_Unbeliever 20 Авг 2018 в 13:37
51931917