Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

Временная таблица сама не удаляется

03.12.2012, 22:43. Показов 16622. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу скрипт и создаю в нём временную таблицу, он отрабатывает нормально 1 раз, а при попытке исполнить его во второй раз sql server пишет:
"В базе данных уже существует объект с именем "#Призовнички"." , те получается что моя временная таблица совсем не временная.
Код скрипта:
SQL
1
2
3
4
5
6
7
8
9
10
11
DECLARE
    @now DATE = GETDATE()
 
SELECT (Фамилия + ' ' + CAST(Имя AS CHAR(1))+'. ' + CAST(Отчество AS CHAR(1))+'.') AS 'Ф.И.О', CAST(Groups.НазваниеГруппы AS CHAR(2)) AS [Специальность]  INTO #Призовнички
    FROM ...
 
SELECT TOP 1  WITH TIES Специальность, COUNT(*) AS Количество FROM #Призовнички
    GROUP BY (Специальность)
    ORDER BY Количество
 
DROP TABLE #Призовнички
Без DROP TABLE #Призовнички это работать не будет так как будет выдавать что таблица уже существует, но почему и как сделать чтобы таблица и впрямь создавалась временная и которая удалялась бы сама сразу же после выполнения всего запроса?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.12.2012, 22:43
Ответы с готовыми решениями:

Временная таблица из запроса
Всем привет! Я осуществляю выборку во временную таблицу. Результат выглядит так: Опыт | Дата проведения | Результат 15 ...

CURSOR + временная таблица... Как сделать?
Есть проблема: во временную таблицу, имя которой каждый раз генериться и сохраняется в переменной @tmpName, заливаются данные. ...

Программа удаляется сама по себе
Здравствуйте, у меня такая проблема. Установил на свой стационарный компьютер windows server 2008, для удаленной работы, т.к. некоторые...

18
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
04.12.2012, 09:34
Табличная переменная?
0
 Аватар для Humanitis
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
04.12.2012, 10:46
Другой сеанс?
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
04.12.2012, 12:39
Цитата Сообщение от Humanitis Посмотреть сообщение
Другой сеанс?
Боюсь предложить... Динамический SQL?!

В первом посте показан не скрипт, а обрубок какой-то.
DROP таблицы вижу. А где и как она создаётся?

И главное - зачем?
Может, и не нужна никакая временная таблица?
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
04.12.2012, 15:24  [ТС]
Цитата Сообщение от iap Посмотреть сообщение
DROP таблицы вижу. А где и как она создаётся?
Скрипт полный, внимание на SELECT ... INTO, мне наверное надо было его подразбить что выбираю на несклько строк чтобы влезало полностью...

Цитата Сообщение от iap Посмотреть сообщение
Может, и не нужна никакая временная таблица?
Нужна, мне сначала нужно её получить и вывести полностью, а потом обработать и вывести часть.

Цитата Сообщение от iap Посмотреть сообщение
Табличная переменная?
Ты о cte ? Не, он мне тут не надо.

Цитата Сообщение от Humanitis Посмотреть сообщение
Другой сеанс?
Это не понял. Я просто хочу создать временную таблицу которая будет жить только в этом пакете и которая удалится после его исполнения. Создаю я её посредством того что пишу SELECT ... INTO #таблица . Переменную #таблица я не объявляю как видно.
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
04.12.2012, 15:56
Цитата Сообщение от Gepar Посмотреть сообщение
Скрипт полный, внимание на SELECT ... INTO, мне наверное надо было его подразбить что выбираю на несклько строк чтобы влезало полностью...


Нужна, мне сначала нужно её получить и вывести полностью, а потом обработать и вывести часть.


Ты о cte ? Не, он мне тут не надо.


Это не понял. Я просто хочу создать временную таблицу которая будет жить только в этом пакете и которая удалится после его исполнения. Создаю я её посредством того что пишу SELECT ... INTO #таблица . Переменную #таблица я не объявляю как видно.
1. Да, строка Ваша длинная, ушла за правый край, не увидел её конец...
2. #временная таблица живёт до конца коннекта. Не понимаю, что нужно-то? Чем не устраивает?
3. "обработать" - это как? Вывести можно и из исходной таблицы.
4. Табличная переменная - это не CTE. Существует с SQL2000. Время жизни - запрос (не весь пакет!)
5. Если временную таблицу создать внутри DSQL, то она дропнется при завершении выполнения ВЫЙД
6. Разные коннекты в MSSQLSMS можно смоделировать разными окнами с запросами. Если грубо.
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
04.12.2012, 16:55  [ТС]
Ок, ещё раз. Чисто теоретически (практически я эту задачу сдал и так, это уже мне просто так хочеться сделать:
Я хочу создать таблицу так чтобы она существовало до конца пакета, те до первого же GO, а после этого пропадала. Вот как обычная переменная которую я через DECLARE объявляю.
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
04.12.2012, 17:20
Цитата Сообщение от Gepar Посмотреть сообщение
Ок, ещё раз. Чисто теоретически (практически я эту задачу сдал и так, это уже мне просто так хочеться сделать:
Я хочу создать таблицу так чтобы она существовало до конца пакета, те до первого же GO, а после этого пропадала. Вот как обычная переменная которую я через DECLARE объявляю.
Говорю же, ТАБЛИЧНАЯ ПЕРЕМЕННАЯ!
T-SQL
1
DECLARE @Призовнички TABLE([Ф.И.О] CHAR(100),[Специальность] CHAR(2));
1
 Аватар для Humanitis
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
04.12.2012, 17:52
Цитата Сообщение от iap Посмотреть сообщение
Говорю же, ТАБЛИЧНАЯ ПЕРЕМЕННАЯ!
Придерживайся условий квеста
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
04.12.2012, 21:44  [ТС]
iap, ну это не очень интересно А почему при создании по #имя_таблички оно создаёт тогда такую таблицу что не удаляется в конце выполнения (не смены сеанса), это не очень удобно ...
0
36 / 19 / 1
Регистрация: 14.12.2012
Сообщений: 59
14.12.2012, 16:36
Временная таблица на самом деле почти тоже самое, что и обычная таблица, только создается с уникальным именем: заданное имя + некий id. Посмотреть список временных таблиц можно скриптом:
SQL
1
SELECT TABLE_NAME FROM tempdb.information_schema.tables
На временной таблице можно создать индекс, определить констреинт и другие вещи, присущие обычным таблицам, соответственно использовать их лучше на больших объемах данных (а на маленьких быстрее будет работать переменная таблица). Временная таблица будет доступна во внутреннем scope, в том числе в dsql, и это ее свойство нередко удобно использовать при написании сложных запросов. По этой причине SQL Server не удаляет временную таблицу при завершении выполнения, это нужно контролировать руками.
Если временная таблица определена внутри хранимой процедуры, удалять ее явно не нужно - временная таблица уникальна в пределах scope (и всех внутренних scope), поэтому проблем при параллельной работе двух хранимых процедур не будет. И лучше явно не удалять временную таблицу в конце процедуры, так как в этом случае схема таблицы закешируется и при повторном вызове выполнение будет немного быстрее.
Как уже говорили, есть еще табличные переменные, и еще глобальные временные таблицы. Посмотрите описание этих объектов, может быть тогда перестанет казаться странным и неудобным то, что временная таблица не удаляется.
1
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
14.12.2012, 17:20
Локальная временная таблица живет до конца сессии если она не создана внутри хранимой процедуры. Созданная внутри хранимой процедуры доступна только в ней и удаляется при выходе. Последнее не совсем верно. Если процедуру запустить в транзакции, то таблица удалится только по завершении транзакции, хотя доступа к ней вне процедуры все равно нет
1
36 / 19 / 1
Регистрация: 14.12.2012
Сообщений: 59
14.12.2012, 17:37
Спасибо, не знал. Для желающих проверить и поэкспериментировать с видимостью временных таблиц в процедуре в транзакции:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE PROCEDURE TestTempTable
AS
BEGIN
 
CREATE TABLE #tempTableA (x INT)
SELECT 'in proc', TABLE_NAME FROM tempdb.information_schema.tables WHERE TABLE_NAME LIKE '#tempTableA%'
 
END 
 
 
BEGIN tran
EXEC TestTempTable
SELECT 'in tran', TABLE_NAME FROM tempdb.information_schema.tables WHERE TABLE_NAME LIKE '#tempTableA%'
--select * from #tempTableA - Invalid object name '#tempTableA'
commit tran
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
14.12.2012, 23:33
Стоит добавить, что второе выполнение процедуры TestTempTable в рамках одной транзакции даст ошибку о существовании временной таблицы с именем #tempTableA.
0
 Аватар для Devil_FoX
168 / 142 / 1
Регистрация: 01.04.2010
Сообщений: 474
17.12.2012, 11:26
Всегда перед созданием временной таблицы проверяйте на наличие уже созданной времянки и удаление её если она есть.
T-SQL
1
2
3
if object_id('tempdb..#tempTableA') is not null drop table #tempTableA -- проверка и удаление временной табл.
CREATE TABLE #tempTableA (x INT)
.....
Или при повторном запуске может выскочить ошибка, как говорит Аватар

Так же желательно и в конце блока, когда временная табл. уже не нужна тоже устроить проверку и удаление временной таблицы - освободить ОЗУ и ПЗУ сервера, не оставлять её до выключения сеанса.
0
36 / 19 / 1
Регистрация: 14.12.2012
Сообщений: 59
17.12.2012, 12:36
Аватар, что-то не получается ошибки, таблицы создаются с уникальными именами для каждой процедуры:
SQL
1
2
3
4
5
BEGIN tran
EXEC TestTempTable
EXEC TestTempTable
SELECT 'in tran', TABLE_NAME FROM tempdb.information_schema.tables WHERE TABLE_NAME LIKE '#tempTableA%'
commit tran
Имена таблиц:
SQL
1
2
#tempTableA_________________________________________________________________________________________________________000000000172
#tempTableA_________________________________________________________________________________________________________000000000168


Devil_FoX, удалять явно или не явно, это еще большой вопрос. Если явно не удалять, SQL Server будет кэшировать метаданные и аллоцированные страницы, что ускорит повторное использование (около 50ms).
0
 Аватар для Devil_FoX
168 / 142 / 1
Регистрация: 01.04.2010
Сообщений: 474
17.12.2012, 12:47
nvnlive, запусти два раза и более этот код в одном окне (не меняя сеанса):
T-SQL
1
create table #tab (N int)
если на второй запуск не будет ошибки то мне очень будет интересно что за настройки у тебя установлены.
0
36 / 19 / 1
Регистрация: 14.12.2012
Сообщений: 59
17.12.2012, 13:14
Devil_FoX, в рамках одного сеанса будет ошибка, никакой магии.
Аватар, писал про "второе выполнение процедуры TestTempTable в рамках одной транзакции"
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
17.12.2012, 21:06
Каюсь, напутал в #14. Cам был в заблуждении и форумчан пытался ввести nvnlive, тебе + за дотошливость
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.12.2012, 21:06
Помогаю со студенческими работами здесь

Содержимое папки программы удаляется сама по себе
Добрый день, у метя возникла такая ситуация. Установил на свой стационарный компьютер windows server 2008, для удаленной работы, т.к....

Временная таблица
Попытался создать временную таблицу. Почемуто не работает. Это работает: $query = mysql_query("SELECT `idd` `namea` FROM...

Временная таблица
Доброй ночи. В многопользовательской локальной БД нужна такая фишка: некая общая область (таблица) данных, доступная только во время работы...

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

Не работает временная таблица
Здравствуйте. У меня C++ Builder 6, MS SQL 2005. Я никогда с временными таблицами не работал. Создал временную таблицу вот...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru