С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
14 / 13 / 1
Регистрация: 17.04.2023
Сообщений: 107

Временные таблицы

20.11.2024, 18:01. Показов 774. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые. Вопрос к знатокам. Например, есть временная таблица #temptable1, которая получается следующим образом:
SQL
1
2
3
4
5
6
SELECT 
id
,name
INTO #temptable1
FROM tbl
DROP TABLE #temptable1
И есть другая другая временная таблица #temptable2, получаемая другим способом:
SQL
1
2
3
4
5
6
7
8
CREATE TABLE #temptable2
(id INT, name (nvarchar 100))
INSERT INTO #temptable2
SELECT 
id
,name
FROM tbl
DROP #temptable2
Оба эти запроса (по отдельности) выполняются из процедур. Причем, если первый вариант работает без проблем, то второй вариант вызывает ошибку с сообщением о том, что #temptable2 уже существует или что-то типа нет прав на ее изменение (дословно). Если попробовать удалить эту таблицу - то пишется сообщение о том, что ее нет или нет прав на ее удаление (дословно). Порядок выполнения процедур на возникновение ошибки не влияет. Если изменить имя временной таблицы во втором варианте, то проблема сохраняется все равно. Такое ощущение складывается, что влияет способ создания временной таблицы/внесения в нее данных. Собственно вопрос, из за чего такая ситуация может возникать, хотя бы примерно в теории.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2024, 18:01
Ответы с готовыми решениями:

Временные таблицы
Подскажите, плз, как можно определить , висит ли в памяти временная таблица? Если да , то чтобы ее убить и создать по новой. Спасибо.

как создавать временные таблицы?
Кто-нибудь может подсказать как эффективнее создать временную таблицу для одного пользователя и чтобы она существовала на протяжении его...

MsSQL SMS18 - временные таблицы
Здравствуйте! При создании #Temp команда выполняется, но в обозревателе таблица не появляется. В дереве папок обозревателя в...

6
1304 / 358 / 97
Регистрация: 14.10.2022
Сообщений: 1,087
20.11.2024, 21:02
Замените на
T-SQL
1
DROP if exists #temptable2
Что получится?

И, кстати, в хранимых процедурах не нужно делать drop временной таблицы, если вы, по ходу выполнения не собираетесь создавать таблицу с тем же именем (ну, или если у вас ооооочень долго выполняющаяся ХП, в которой создается оооочень большая временная таблица, которая не нужна сразу после создания, а ХП после ее использования выполнятся еще несколько минут).
Для временных таблиц, создаваемых в ХП, существует оптимизатор на уровне engine, ускоряющий их создание и выделение памяти под нее. А если внутри ХП есть drop этой таблицы, то оптимизация, вроде как, отключается (давно, краем уха слышал, может и не так, но затвердил железно - дропать временные таблицы в теле ХП - вредно).

И категорически нельзя дропать временные таблицы при входе в ХП, до их создания!

Т.е. что-то типа такого:
T-SQL
1
2
3
4
5
6
7
Create proc dbo.a
as
Begin
Set nocount on;
Drop table if exists #t;
Create table #t (i int);
...
Категорически нельзя.
Жуткий антипаттерн и источник ошибок.
Догадаетесь, почему?
:-)
1
46 / 35 / 11
Регистрация: 16.10.2011
Сообщений: 121
21.11.2024, 07:45
Цитата Сообщение от uaggster Посмотреть сообщение
Жуткий антипаттерн и источник ошибок.
ну, тут палка о двух концах, и удаление перед созданием при существовании, и его отсутствие может вести к ошибкам в разработке.
Если в друг, во вложенной процедуре такое же имя временной таблицы, а в процедуре где-нибудь посреди скрипта она дропается для освобождения памяти при каких-то условиях. При дальнейшей правке ниже условия с дропом добавится код, который будет использовать эту таблицу, и при выполнении условия дропа будет использоваться таблица от верхней процедуры, а при невыполнении от текущей.

Кроме того, на этапе отладки нужен дроп с проверкой на существование, что потом и перекочевывает в процедуры.

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

Добавлено через 2 минуты
На самом деле, хотелось бы знать на сколько может быть существенной разница с дропом в конце и без него

Добавлено через 2 минуты
где-то писали что да оптимизирует, где-то что да, но не такая уж и большая разница

Добавлено через 28 минут
Цитата Сообщение от andrey197888888 Посмотреть сообщение
второй вариант вызывает ошибку с сообщением о том, что #temptable2 уже существует или что-то типа нет прав на ее изменение (дословно)
а ошибка то появляется при запуске процедуры, или все же при запуске скрипта в менеджемнт студии?
во втором случае да, ее нужно дропать перед созданием(если первый раз запускалось без дропа в конце, или если ошибка возникла до него, но таблица уже создалась)

Добавлено через 7 минут
а в таком виде как приведен, если их оформить процедурой, то ошибок быть не должно
1
139 / 105 / 36
Регистрация: 27.07.2022
Сообщений: 357
21.11.2024, 08:04
Цитата Сообщение от uaggster Посмотреть сообщение
Для временных таблиц, создаваемых в ХП, существует оптимизатор на уровне engine, ускоряющий их создание и выделение памяти под нее. А если внутри ХП есть drop этой таблицы, то оптимизация, вроде как, отключается (давно, краем уха слышал, может и не так, но затвердил железно - дропать временные таблицы в теле ХП - вредно).
Емнип, в ХП без разницы есть ли дроп таблицы, нет ли дропа таблицы - таблица всё равно закешируется и переиспользуется, чтоб каждый раз не создавать с нуля. Данные, разумеется, нет, но сама таблица - да. Из забавного - заодно закешируется статистика. И при следующем запуске будет "новая" таблица с новыми данными, но со старой статистикой, что может, порой, привести к неожиданным планам исполнения
1
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
21.11.2024, 08:28
Paul White Explains Temp Table Caching 3 Ways
1
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
21.11.2024, 08:40
Цитата Сообщение от uaggster Посмотреть сообщение
Для временных таблиц, создаваемых в ХП, существует оптимизатор на уровне engine, ускоряющий их создание и выделение памяти под нее.
Да, при трёх условиях, что размер меньше 8М, не используются именованные объекты и не меняется схема таблицы, а-ля

T-SQL
1
2
3
create index MyPrimaryKey on #table()
и
alter #table чЁ-то там
тогда при повторном создании такой таблицы будут использованы закешированные метаданные.

Цитата Сообщение от uaggster Посмотреть сообщение
А если внутри ХП есть drop этой таблицы, то оптимизация, вроде как, отключается (давно, краем уха слышал, может и не так, но затвердил железно - дропать временные таблицы в теле ХП - вредно).
Не влияет.

Temp DB Дмитрий Короткевич (смотреть с 15 мин)
2
14 / 13 / 1
Регистрация: 17.04.2023
Сообщений: 107
23.11.2024, 06:05  [ТС]
Всем спасибо за ответы. Проблема была в моей невнимательности так скажем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.11.2024, 06:05
Помогаю со студенческими работами здесь

Временные таблицы в хранимых процедурах
Добрый день Сегодня встретился с хранимой процедурой, в которой используется временная таблица CREATE PROCEDURE . @int int...

Перенос данных через временные таблицы
Есть база с таблицей пользователей и с таблицей бывших имен (в случае, если пользователь менял Имя), есть вторая база, куда надо все...

Временные таблицы на MS SQL Server 2000 и все все все... (+)
Начну по порядку. Пишу клиента на VB. Сервер - MS SQL Server 2000. Так вот хочу я создать некий отчет. Данные, нужные для отчета...

Временные таблицы?
Добрый день! Подскажите пожалуйста по задаче: Есть пользователи. Каждый из пользователей может положить в базу документы. Как...

Временные таблицы
Объясните, пожалуйста, в чем разница между обычной таблицей и временной?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru