Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/78: Рейтинг темы: голосов - 78, средняя оценка - 4.78
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

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

03.12.2012, 22:43. Показов 16457. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru