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

Откуда:
Сообщений: 19
Здравствуйте, дамы и господа.

Прошу ваших советов по ситуации:

Делаю ХП с разветвлённой логикой.
По одной ветке логики нужен SELECT INTO #myTab
По др. ветке логики (ELSE) надо CREATE TABLE #myTab, чтобы обезпечить её наличие, т.к. в дальнейшем она используется в результирующем SELECT.

Однако, создать такую ХП не удаётся, компилятор тупит и не видит моей логики.
Ошибка: В базе данных уже существует объект с именем "#myTab".
13 ноя 18, 12:42    [21732871]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
Не надо так делать. Создавайте таблицу один раз без всяких if через create table.
13 ноя 18, 12:44    [21732874]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
AndreyVP
Member

Откуда:
Сообщений: 19
Изначально так и было:
CREATE #myTab
затем
INSERT INTO #myTab.

Однако запрос очень велик, выполняется долго.
Недавно узнал, что SELECT INTO выполняет более чем в 2 раза быстрее. Это действительно так, проверял.
Захотел переделать ХП, а тут такая ошибка.
13 ноя 18, 12:48    [21732881]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
invm
Member

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

select
 ...
into
 #MyTab
from
 ...
where
 (условие из if = true) and
 ...
13 ноя 18, 12:59    [21732896]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
Eleanor
Member

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

Можно спрятать SELECT INTO #myTab в EXEC
13 ноя 18, 13:02    [21732901]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
AndreyVP
Member

Откуда:
Сообщений: 19
invm, спасибо, неплохой совет. К сожалению, помимо этого SELECT INTO в данной ветке логики ещё много всего, включая наполнение ещё пары временных таблиц для использования их в этом SELECT INTO.
13 ноя 18, 13:05    [21732909]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
AndreyVP
К сожалению, помимо этого SELECT INTO в данной ветке логики ещё много всего, включая наполнение ещё пары временных таблиц для использования их в этом SELECT INTO.
И чем это мешает?
Наполнение временных таблиц можно сделать аналогичнымспособом.
13 ноя 18, 13:12    [21732919]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
AndreyVP
Member

Откуда:
Сообщений: 19
Eleanor, попробовал, но не работает. Наверное, EXEC делается не в той же сессии.
Данный SQL:
exec('CREATE TABLE #myTab (ID int primary key)')
SELECT * FROM #myTab
даёт ошибку Недопустимое имя объекта "#myTab".
13 ноя 18, 13:20    [21732937]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
AndreyVP
Member

Откуда:
Сообщений: 19
invm, а ведь верно!
Спасибо!
13 ноя 18, 13:21    [21732939]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
Eleanor
Member

Откуда:
Сообщений: 2632
AndreyVP
Eleanor, попробовал, но не работает. Наверное, EXEC делается не в той же сессии

Действительно. Получается только с глобальной временной таблицей, но она вам явно не нужна
IF 1 = 1
BEGIN
	EXEC('SELECT * INTO ##myTab FROM sys.tables')
	SELECT * FROM ##myTab
END
ELSE
	CREATE TABLE ##myTab (ID int primary key)
13 ноя 18, 13:57    [21732983]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
KRS544
Member

Откуда:
Сообщений: 497
AndreyVP
Изначально так и было:
CREATE #myTab
затем
INSERT INTO #myTab.

Однако запрос очень велик, выполняется долго.
Недавно узнал, что SELECT INTO выполняет более чем в 2 раза быстрее. Это действительно так, проверял.
Захотел переделать ХП, а тут такая ошибка.


может INSERT INTO #myTab with (tablock) поможет?
13 ноя 18, 14:30    [21733031]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
sti
Member

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

ну сделайте в разных ветках разные временные таблицы. Вас всё равно проклянут те, кому потом придется с этой процедурой разбираться.
13 ноя 18, 15:56    [21733200]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
uaggster
Member

Откуда:
Сообщений: 767
Народ, может я чего-то не понимаю, а что мешает перед созданием таблицы вставить:
if object_id('tempdb..#t') is not null
Drop table #t

?
16 ноя 18, 09:26    [21735944]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
PizzaPizza
Member

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

Судя по тому, что пишут

SELECT INTO

This method can be faster and more efficient than the first if your database is configured to use the simple or bulk logged recovery method, as the logging generated by the statement will be minimal.


возможно лучшим решением было бы посмотреть в сторону минимизации логирования, чем усложнять логику приложения
16 ноя 18, 09:47    [21735960]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
Владислав Колосов
Member

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

автор
что мешает


дизайн сервера.
16 ноя 18, 12:58    [21736268]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
AndreyVP
Member

Откуда:
Сообщений: 19
uaggster, мешает компилятор SQL Server.

Попробуйте выполнить:
CREATE TABLE #t(ID int)

if object_id('tempdb..#t') is not null
	Drop table #t

CREATE TABLE #t(ID int)
22 ноя 18, 13:16    [21741229]     Ответить | Цитировать Сообщить модератору
 Re: Повторное создание временной таблицы в ХП  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4379
AndreyVP
З
Однако, создать такую ХП не удаётся, компилятор тупит и не видит моей логики.
Ошибка: В базе данных уже существует объект с именем "#myTab".


Скопируйте скрипт в новое окна и запустите , либо
if object_id('tempdb..#t') is not null
Drop table #t
22 ноя 18, 15:02    [21741446]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить