Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
17.12.2001, 12:03
|
|||
|---|---|---|---|
Временные таблицы и ХП |
|||
|
#18+
MS SQL7 SP3. Я недавно наткнулся на новое для меня поведение временных таблиц в ХП - может кому-то ещё будет интересно. Если процедура "а" создаёт временную таблицу #t и вызывает процедуру "аа", то "аа" видит временную таблицу #t - это понятно. Если же процедура "аа" сама создаёт временную таблицу #t, то не возникает ошибки, и таблица образуется. По выходу из "аа" "а" видит исходную версию таблицы. IMHO довольно нелогичное поведение. Вот скрипт: if exists ( select * from sysobjects where id = object_id(N'[dbo].[a]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[a] if exists ( select * from sysobjects where id = object_id(N'[dbo].[aa]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[aa] go CREATE PROCEDURE a AS set nocount on select 1 as a into #t exec aa select 'a', * from #t GO CREATE PROCEDURE aa AS select 'aa', * from #t select 2 as a, 'test' as t into #t select 'aa', * from #t GO exec a a ---- ----------- aa 1 a t ---- ----------- ---- aa 2 test a ---- ----------- a 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.12.2001, 12:06
|
|||
|---|---|---|---|
Временные таблицы и ХП |
|||
|
#18+
Почему же не логично, всё логично, в данном случае можно сказать что временная таблица это как-бы глобальная переменная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.12.2001, 12:48
|
|||
|---|---|---|---|
Временные таблицы и ХП |
|||
|
#18+
2 Тarantino: Если бы поведение было как у глобальных переменных, то после вызова ХП "аа" в процедуре "а" содержимое временной таблицы изменялось, а это не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.12.2001, 19:43
|
|||
|---|---|---|---|
Временные таблицы и ХП |
|||
|
#18+
А почему вы решили что select 2 as a, 'test' as t into #t есть добавление еще одной записи в существующую таблицу ? В BOL же сказано "The SELECT INTO statement creates a new table and populates it with the result set of the SELECT . The structure of the new table is defined by the attributes of the expressions in the select list" Если заменить приведенную выше строку на update #t set a = 2, то все работает правильно. Дело в том то на самом деле временные таблицы имеют имя в виде ИмяЗаданноеПользователем+символы"_"+12значноеHexчисло (символы "_" нужны для заполнения имени до нужной длины) Т.е. в процедуре А вы создаете временную таблицу с уникальным именен вроде такого #t__________________________________________________________________________________________________________________0001000007AC, !! не просто #t !!! а в процедуре АА из-за того, что используете select ... into вы опять создаете временную процедуру с уникальным именем #t__________________________________________________________________________________________________________________0002000007AC т.е. никакого казалось бы ожидаемого конфликта на самом деле нет - оба объекта уникальны(для системы) А дальше все еще проще "A local temporary table created within a stored procedure or trigger is distinct from a temporary table with the same name created before the stored procedure or trigger is called. If a query references a temporary table, and two temporary tables with the same name exist at that time, it is not defined which table the query is resolved against. Nested stored procedures can also create temporary tables with the same name as a temporary table created by the stored procedure that called it. All references to the table name in the nested stored procedure are resolved to the table created in the nested procedure " Т.е. временная таблица номер2 внутри процедуры АА будет иметь более высокий приоритет при , т.к. создана в ней. Для того, чтобы работать со временной таблицой номер1(созданной в процедуре А), обращаться к ней нужно по полному имени. Увидеть имена и идентификаторы ваших временных таблиц вы сможете, если добавите в ваши проверочные запросы следующие столбцы object_id('tempdb..#t'), (select top 1 name from tempdb..sysobjects where id=object_id('tempdb..#t')) ЗЫ Проверял на SQL2000 SP2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.12.2001, 17:50
|
|||
|---|---|---|---|
Временные таблицы и ХП |
|||
|
#18+
2 Glory: Спасибо за подробный ответ! Мог и сам прочитать! Собственно, нетривиальной мне показалась эта часть: "Nested stored procedures can also create temporary tables with the same name as a temporary table created by the stored procedure that called it. All references to the table name in the nested stored procedure are resolved to the table created in the nested procedure". Странно звучит фраза "...If a query references a temporary table, and two temporary tables with the same name exist at that time, it is not defined which table the query is resolved against. "Получается, могут быть ситуации, когда временная таблица, участвующая в запросе, выбирается случайно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
19.12.2001, 10:45
|
|||
|---|---|---|---|
Временные таблицы и ХП |
|||
|
#18+
Насчет первой цитаты - это все-таки локальные временные таблицы. Логично, что нечто локальное имеет больший приоритет там, где оно было создано. Насчет второй цитаты - если предположить, что триггер пытается получить id временной таблицы таким путем select top 1 * from tempdb..sysobjects where name like '#t%' (!без order by!), то BOL по этому поводу также ясно сказано, что при порядок вывода записей без order by непрогназируем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=46&tablet=1&tid=1824561]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
22ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 301ms |

| 0 / 0 |
