Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 как можно удалить все временные объекты из данной сессии  [new]
abort
Member

Откуда:
Сообщений: 625
В процедуре создается много временных таблиц #.
Удаление происходит по одной таблице
if object_id('tempdb..#table') is not null
  drop table #table

Можно ли вывести и удалить все временные таблицы, созданные в текущей сессии?
10 июн 15, 06:18    [17753206]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
BOL->CREATE TABLE
Temporary tables are automatically dropped when they go out of scope, unless explicitly dropped by using DROP TABLE:

•A local temporary table created in a stored procedure is dropped automatically when the stored procedure is finished
...
10 июн 15, 07:49    [17753259]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
abort
Member

Откуда:
Сообщений: 625
pkarklin,

иногда случается, что если в процедуре ошибка возникла, то временная таблица не успевает удалиться, т.к. сессия еще живет
10 июн 15, 09:34    [17753484]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
человек_ниоткуда
Guest
abort, ошибка в процедуре (и вообще в SQL-коде) не всегда приводит к убиванию сессии. Почитай в статье про RAISEERROR на эту тему. А если сессия должна удалиться, то уже никакой код в ней ты не выполнишь.
10 июн 15, 09:58    [17753583]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
Glory
Member

Откуда:
Сообщений: 104751
abort
иногда случается, что если в процедуре ошибка возникла, то временная таблица не успевает удалиться, т.к. сессия еще живет

Ну так закройте сессию
10 июн 15, 09:59    [17753590]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
abort
В процедуре создается много временных таблиц #.
Удаление происходит по одной таблице
if object_id('tempdb..#table') is not null
  drop table #table

Можно ли вывести и удалить все временные таблицы, созданные в текущей сессии?


Я так понимаю вопрос надо начать с того, что спросить как получить список временных таблиц, относящихся к данной сессии? В этом загвоздка?
10 июн 15, 10:15    [17753670]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
abort
иногда случается, что если в процедуре ошибка возникла, то временная таблица не успевает удалиться, т.к. сессия еще живет


И Вы можете привести код, воспроизводящий эту ситуацию?
10 июн 15, 10:33    [17753778]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
pkarklin
abort
иногда случается, что если в процедуре ошибка возникла, то временная таблица не успевает удалиться, т.к. сессия еще живет


И Вы можете привести код, воспроизводящий эту ситуацию?


create table #t (id int)
insert #t select 1
select * from #t
insert #t select 1/0
select * from #t
10 июн 15, 11:15    [17754075]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
abort,

Закрывайте сессии при ошибках, это единственный правильный вариант.
10 июн 15, 11:16    [17754077]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
Glory
Member

Откуда:
Сообщений: 104751
WarAnt
create table #t (id int)
insert #t select 1
select * from #t
insert #t select 1/0
select * from #t

А где здесь "если в процедуре ошибка возникла" ?
10 июн 15, 11:16    [17754078]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
WarAnt,

А где здесь процедура?
10 июн 15, 11:17    [17754088]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
pkarklin
WarAnt,

А где здесь процедура?


а ну да процедуру я и не заметил:) подул речь чисто про сессию, тогда да париться не о чем.
10 июн 15, 11:36    [17754227]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
abort
pkarklin,

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

Причем здесь процедура? Все временные таблицы, которые созданы в процедуре, умирают вместе с процедурой, такова их область видимости.
10 июн 15, 12:12    [17754441]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
abort
Member

Откуда:
Сообщений: 625
может не так выразился. Да в процедуре они уничтожаются. Но когда приходится дебажить большой скрипт с кол-ом строк больше 12 тыс с созданием 2-3 десяток временных таблиц. Повторный вызов выводит ошибку
There is already an object named '#ttt' in the database.

Хотелось бы вначале такого скрипта запускать блок очистки всех временных таблиц, чтобы быть уверенным, что в этой сессии нет никаких временных таблиц
10 июн 15, 12:40    [17754545]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
Glory
Member

Откуда:
Сообщений: 104751
abort
Повторный вызов выводит ошибку
Хотелось бы вначале такого скрипта запускать блок очистки всех временных таблиц, чтобы быть уверенным, что в этой сессии нет никаких временных таблиц

Нормальный скрипт проверяет наличие объекта перед его созданием
10 июн 15, 12:45    [17754577]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Select name from tempdb.sys.table where name like '#*'
Можно еще object_id(name) is not null проверить

Уже потом удалить в динамике по полученному списку. Но Лучше заранее создавать временяки с определенным префиксом, что бы удобней выбирать
10 июн 15, 12:46    [17754588]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
abort
может не так выразился. Да в процедуре они уничтожаются. Но когда приходится дебажить большой скрипт с кол-ом строк больше 12 тыс с созданием 2-3 десяток временных таблиц. Повторный вызов выводит ошибку
There is already an object named '#ttt' in the database.

Хотелось бы вначале такого скрипта запускать блок очистки всех временных таблиц, чтобы быть уверенным, что в этой сессии нет никаких временных таблиц


В SSMS в окне запроса правую педаль->Connection->Disconnect, затем правую педаль->Сonnection->Connect...
10 июн 15, 12:47    [17754598]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
Okmor
Member

Откуда:
Сообщений: 132
if object_id('tempdb..#Table_list') is not null drop table #Table_list
select  name 
into #Table_list
from tempdb.sys.tables --where not  name like 'R%'
where LEFT(name,2) <>'##' and not name like '#Table_list%'
--или
--where  not name like '#Table_list%'
declare @tablename varchar(254) 

DECLARE @tables_cursor CURSOR
set @tables_cursor = cursor FOR
	 SELECT name FROM #Table_list
OPEN @tables_cursor
FETCH NEXT FROM @tables_cursor INTO @tablename

DECLARE @sqltext VARCHAR(500)
SET NOCOUNT ON;
WHILE @@FETCH_STATUS=0
begin
  if object_id('tempdb..'+@tablename) is not null --drop table #Table_list
  begin
	  set @sqltext =  'drop table '+'tempdb..'+@tablename
	  EXEC (@sqltext) 
	  PRINT 'Видалено таблицю: '+@tablename --+ cast(@@FETCH_STATUS as varchar(10))
  end 
  fetch NEXT FROM @tables_cursor INTO @tablename
end 


if object_id('tempdb..#Table_list') is not null drop table #Table_list



	
10 июн 15, 12:49    [17754610]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
abort
иногда случается, что если в процедуре ошибка возникла, то временная таблица не успевает удалиться, т.к. сессия еще живет
Если таблица создана процедурой, то удалится в любом случае, даже без выполнения drop table #table
Т.е. эти ваши
if object_id('tempdb..#table') is not null
  drop table #table
не нужны, избыточны.

Если таблицы создаются в сессии, то проще всего её переоткрыть.

Mike_za
Select name from tempdb.sys.table where name like '#*'
Можно еще object_id(name) is not null проверить

Уже потом удалить в динамике по полученному списку. Но Лучше заранее создавать временяки с определенным префиксом, что бы удобней выбирать
Непонятно, как из этого запроса получить таблицы, принадлежащие текущей сессии, и имена этих таблиц.

Разве что удалять все полученные временные таблицы в обработчике try-catсh
10 июн 15, 12:53    [17754646]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
Okmor,

Вы его проверяли, этот скрипт?

Думаете, это выполнится?
drop table tempdb..#t__________________________________________________________________________________________________________________00000000628C
10 июн 15, 12:56    [17754669]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
Okmor
Member

Откуда:
Сообщений: 132
alexeyvg,
автор
Думаете, это выполнится?

Да. Выполняется. Проверял.
автор
if object_id('tempdb..#table') is not null drop table #table

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

Вы получите только таблицы из своей сессии + глобальные временные таблицы. Их отбрасываем с помощью
 where LEFT(name,2) <>'##'


Select name from tempdb.sys.table where name like '#*'

- Не правильно. Вам нужно удалить только таблицы своей сессии.
10 июн 15, 13:07    [17754747]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
Glory
Member

Откуда:
Сообщений: 104751
Okmor
Вам нужно удалить только таблицы своей сессии.

А как вы их выбрали то ? Только своей сессии то ?
10 июн 15, 13:11    [17754776]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
Okmor
Member

Откуда:
Сообщений: 132
Для педантов:

if object_id('tempdb..#Table_list') is not null drop table #Table_list
select 
 left(name, 
                    len(name)
                    - patindex('%[^_]%', right(reverse(name), len(name)-charindex('_', reverse(name))))
                    - charindex('_', reverse(name))
                    + 1
                ) name
into #Table_list
from tempdb.sys.tables --where not  name like 'R%'
where LEFT(name,2) <>'##' and not name like '#Table_list%'
--или
--where  not name like '#Table_list%'
declare @tablename varchar(254) 

DECLARE @tables_cursor CURSOR
set @tables_cursor = cursor FOR
	 SELECT name FROM #Table_list
OPEN @tables_cursor
FETCH NEXT FROM @tables_cursor INTO @tablename

DECLARE @sqltext VARCHAR(500)
SET NOCOUNT ON;
WHILE @@FETCH_STATUS=0
begin
  if object_id('tempdb..'+@tablename) is not null --drop table #Table_list
  begin
	  set @sqltext =  'drop table '+'tempdb..'+@tablename
	  EXEC (@sqltext) 
	  PRINT 'Видалено таблицю: '+@tablename --+ cast(@@FETCH_STATUS as varchar(10))
  end 
  fetch NEXT FROM @tables_cursor INTO @tablename
end 


if object_id('tempdb..#Table_list') is not null drop table #Table_list
10 июн 15, 13:12    [17754787]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
Glory
Member

Откуда:
Сообщений: 104751
Okmor
Для педантов:

так что в вашем запросе выбирает таблицы, созданные только в вашей сессии ?
10 июн 15, 13:14    [17754806]     Ответить | Цитировать Сообщить модератору
 Re: как можно удалить все временные объекты из данной сессии  [new]
Okmor
Member

Откуда:
Сообщений: 132
Glory,
Каждый запрос работает только в своей сессии и видит только свои #Table
Плюс все глобальные ##Table. - Их отбрасываем с помощью LEFT(name,2) <>'##'
10 июн 15, 13:15    [17754810]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить