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

Откуда: Киев
Сообщений: 434
Вопрос: Как получить список всех временных таблиц только для текущей сессии?
Цель: удаление всех временных таблиц при повторном старте запроса. (Часто занимаюсь отладкой разных запросов, но каждый раз отключаться/подключаться к серверу или каждый раз прописывать в начале запроса удаление конкретных временных таблиц уже надоело).

Можно получить список временных таблиц для всех сессий:
select left(name, charindex('_',name)-1) 
from tempdb..sysobjects
where charindex('_',name) > 0 and
xtype = 'u' and not object_id('tempdb..'+name) is null


Но как получить только для текущей?
24 янв 13, 14:25    [13821648]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Glory
Member

Откуда:
Сообщений: 104760
Leax
Цель: удаление всех временных таблиц при повторном старте запроса

Ну так напишите удаление таблиц, которые использует ваш запрос
24 янв 13, 14:27    [13821664]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Glory
Member

Откуда:
Сообщений: 104760
Leax
(Часто занимаюсь отладкой разных запросов, но каждый раз отключаться/подключаться к серверу или каждый раз прописывать в начале запроса удаление конкретных временных таблиц уже надоело).

Оформите запрос в процедуру.
24 янв 13, 14:28    [13821669]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Leax
Member

Откуда: Киев
Сообщений: 434
Glory
Leax
Цель: удаление всех временных таблиц при повторном старте запроса

Ну так напишите удаление таблиц, которые использует ваш запрос

Ну так в разных запросах разные таблицы. Каждый раз прописывать ручками:
if object_id('tempdb..#mytable','u') is not null
	drop table #mytable

уже запарило, т.к. таблиц может быть и 20. Потому тема и возникла...
Хочется сделать стандартный блок, вставляемый в начало любого отлаживаемого запроса.
24 янв 13, 14:33    [13821722]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Glory
Member

Откуда:
Сообщений: 104760
Leax
Ну так в разных запросах разные таблицы. Каждый раз прописывать ручками:

Там в студии есть кнопочка Save file, если вы не в курсе.
24 янв 13, 14:35    [13821744]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Leax
Member

Откуда: Киев
Сообщений: 434
Glory
Оформите запрос в процедуру.

Я наоборот- процедуру развернул в запрос для наглядности. Хотя, возможно, стоит подумать об изменении тактики отладки )
24 янв 13, 14:37    [13821756]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Leax
Member

Откуда: Киев
Сообщений: 434
Glory
Там в студии есть кнопочка Save file, если вы не в курсе.

И что? Там много кнопочек есть
24 янв 13, 14:38    [13821764]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Glory
Member

Откуда:
Сообщений: 104760
Leax
И что? Там много кнопочек есть

Так нажмите ее и не надо будет больше "парится" с написанием удаления 20 таблиц
24 янв 13, 14:39    [13821771]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Leax
Member

Откуда: Киев
Сообщений: 434
Glory
Так нажмите ее и не надо будет больше "парится" с написанием удаления 20 таблиц

Вы первый пост читали? Или за идиотов всех держите?
автор
Часто занимаюсь отладкой разных запросов

автор
каждый раз прописывать в начале запроса удаление конкретных временных таблиц уже надоело
24 янв 13, 14:41    [13821792]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Glory
Member

Откуда:
Сообщений: 104760
Leax
Вы первый пост читали? Или за идиотов всех держите?

Нет. За ленивых идиотов.
24 янв 13, 14:43    [13821814]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Leax
Member

Откуда: Киев
Сообщений: 434
Glory,
а еще модератор...
24 янв 13, 14:48    [13821865]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Гость333
Member

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

У вас какая версия? Для версии 2000 способ получения временных таблиц по spid'у описан тут: https://www.sql.ru/forum/actualthread.aspx?tid=119347&pg=-1

Если версия 2005+, то описанный способ не работает. Но можно сделать курсор по объектам, которые выдаёт ваш запрос (кстати, запрос не вполне корректен) — и по каждому объекту
begin try
  exec ('drop table ' + @name)
end try
begin catch
end catch
24 янв 13, 15:49    [13822412]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Leax
Member

Откуда: Киев
Сообщений: 434
Гость333,

Инфа по ссылке интересная, спасибо. Изучу внимательнее, может и пригодится.
Насчет некорректности курсора из 1-го поста согласен - потому и тема создана )
24 янв 13, 16:47    [13822859]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Glory
Member

Откуда:
Сообщений: 104760
Leax
Glory,
а еще модератор...

Именно поэтому я честно ответил на ваш вопрос.
Надеюсь, вы не считаете, что модератор обязан давать только те ответы, которые вам нравятся ?

Зачем писать какой то скрипт вместо того, чтобы выполнить весь скрипт в отдельном батче, мне лично не понятно.
24 янв 13, 17:11    [13822996]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Glory
Зачем писать какой то скрипт вместо того, чтобы выполнить весь скрипт в отдельном батче, мне лично не понятно.
В принципе было бы удобно повесить на горячую клавишу удаление временных таблиц.

Тогда при копировании и отладке фрагментов ХП, в которых создаются или используются временные таблицы, не нужно было бы добавлять их удаление.

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

Да, в изначальном скрипте ещё нужно учесть возможность наличия символов _ в именах временных таблиц.
24 янв 13, 17:21    [13823059]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Glory
Зачем писать какой то скрипт вместо того, чтобы выполнить весь скрипт в отдельном батче, мне лично не понятно.
Да, забыл собственно спросить - а как выполнить в батче? Имеется в виду - при необходимости переоткрывать коннект, или вы знаете более простой способ?
24 янв 13, 17:23    [13823069]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Glory
Member

Откуда:
Сообщений: 104760
alexeyvg
Тогда при копировании и отладке фрагментов ХП, в которых создаются или используются временные таблицы, не нужно было бы добавлять их удаление.

exec('тут мой фрагмент') не спасет что ли ?
24 янв 13, 17:23    [13823071]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Glory
exec('тут мой фрагмент') не спасет что ли ?

Имеется хранимая процедура на пару тысяч строк. В начале этой процедуры — с десяток "CREATE TABLE #TMP_xxx". Есть предположение, что где-то с тысячной строки идут неправильные расчёты. Берём исходник процедуры, убираем CREATE PROCEDURE, получаем обычный батч. В тысячной строке ставим RETURN. Жмём F5, дожидаемся выполнения. Пишем различные селекты из временных таблиц, проверяем правильность данных. Выделяем мышкой следующую команду, выполняем. Снова смотрим результаты селектов. Нашли какую-то ошибку, исправили, переставили RETURN, выполняем батч с самого начала. И т.д.

В общем, exec('тут мой фрагмент') никак не спасёт.
24 янв 13, 18:03    [13823377]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Гость333
Имеется хранимая процедура на пару тысяч строк. В начале этой процедуры — с десяток "CREATE TABLE #TMP_xxx". Есть предположение, что где-то с тысячной строки идут неправильные расчёты. Берём исходник процедуры, убираем CREATE PROCEDURE, получаем обычный батч. В тысячной строке ставим RETURN. Жмём F5, дожидаемся выполнения. Пишем различные селекты из временных таблиц, проверяем правильность данных. Выделяем мышкой следующую команду, выполняем. Снова смотрим результаты селектов. Нашли какую-то ошибку, исправили, переставили RETURN, выполняем батч с самого начала. И т.д.
В большинстве случаев, отладочное выполнение можно обернуть в транзакцию с откатом и не заморачиваться удалением временных таблиц. Если же таки нужно прибить все временные таблицы, то включить sqlcmd mode и в начале скрипта написать команду :connect.
24 янв 13, 18:37    [13823602]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Glory
alexeyvg
Тогда при копировании и отладке фрагментов ХП, в которых создаются или используются временные таблицы, не нужно было бы добавлять их удаление.

exec('тут мой фрагмент') не спасет что ли ?
Нет конечно, не спасёт :-)

Типовая задача следущая (у ТС такая-же - 146% ):

Есть процедура, строк на тыщу-две, в процедре сотни стейтментов, десятка два таблиц.

Вот клиент поменял что то на источнике данных, что то перестало работать, нужно разобраться.

Я копирую текст процедуры, выполняю кусками, делаю выборки и всё такое.

Потом до чего то додумался, решал поменять условия запросов вверху, удаляю времянки, начинаю заново. Вот как то так.

Понятно, что если можно выполнить всё это за один раз, то я просто запущу процедуру (сделав копию, если надо), но не всегда можно так просто и быстро отладить, иногда процесс более сложен.
А уж оборачивать текст в exec() - вообще нереально, замучаюсь кавычки удваивать, проще в процедуру обернуть.
24 янв 13, 21:22    [13824220]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Гость333
Имеется хранимая процедура на пару тысяч строк.
О, ну да, прям то же самое :-)

Да, бывает сложная отладка, запросики могут долго выполняться, так что вызывать всю процедуру по многу раз неудобно, просто очень долго. Ну и тут же делаешь выполнение одного логического блока в разных вариантах, что бы понять, где данные теряются... Так что частями удобнее.
24 янв 13, 21:25    [13824231]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
invm
В большинстве случаев, отладочное выполнение можно обернуть в транзакцию с откатом и не заморачиваться удалением временных таблиц
Бывает, пару часов и даже пару дней отлаживаю. Кому то может не понравится транзакция на столько времени :-)

Для быстрых процедур я так и делаю - меняю в процедуре (её копии), ставлю туда же отладочные вызовы и т.д.

Но для тяжёлых процедур это не подходит.
24 янв 13, 21:27    [13824238]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
alexeyvg,

Ну я же не панацею предложил :)
Для отладки тяжелых процедур с множеством времянок пользую :connect и set noexec on/off.
24 янв 13, 21:55    [13824313]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
Leax,
А что мешает удалять курсором по Вашему запросу?
CREATE TABLE #T(i int)
CREATE TABLE #T1(i int)
CREATE TABLE #T_32(i int)
CREATE TABLE #T___23__(i int)

DECLARE @Name varchar(1000)

DECLARE c CURSOR FOR
	SELECT
		Name
	FROM tempdb.sys.sysobjects
	WHERE 
		xtype = 'U' 
		AND OBJECT_ID('tempdb..'+name) IS NOT NULL
		AND Name LIKE '#[^#]%'

OPEN c
FETCH NEXT FROM c INTO @Name
WHILE @@FETCH_STATUS = 0 BEGIN
	SET @Name = 'DROP TABLE ' + @Name
	EXEC(@Name)
	FETCH NEXT FROM c INTO @Name
END
CLOSE c
DEALLOCATE c;

Проверял на 2005 Express, работает.
25 янв 13, 03:32    [13824988]     Ответить | Цитировать Сообщить модератору
 Re: Список временных таблиц для текущей сессии  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Сергей Мишин
А что мешает удалять курсором по Вашему запросу?
Упадёт на ошибке, когда появится таблица из чужой сессии (собственно, вопрос то именно про это - как разделить).

Можно действительно в try - catch, как Гость333 предложил.
25 янв 13, 09:06    [13825431]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить