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

Откуда: СПб
Сообщений: 324
Немного не понимаю, как "живут" временные таблицы.
Вот например,
create table #T
	(A varchar(30),
	B varchar(4));
insert into #T
	(A, B)
values
	('AA', 'BB');
select * from #T
drop table #t
Селект отрабатывает нормально.
Стоит засунуть создание таблицы и присвоение значений в хранимку
CREATE PROCEDURE [dbo].[get_val] (@p_a    nvarchar(60),
                                  @p_b nvarchar(4))  
AS
begin
	begin try
		create table #T
			(A    varchar(30),
			 B varchar(4));
	end try
	begin catch	
		delete from #T;
	end catch;
	insert into #T
		(A, B)
	values
		(@p_a, @p_b); 
end
и запустить:
EXEC [dbo].[get_val]
		'AAAA',
		'BBBB'

select * from #T
Получаем вот такое:
(1 row(s) affected)
Msg 208, Level 16, State 0, Line 6
Invalid object name '#T'.

Не могу понять почему - я же все делаю в одной сессии - т.о. таблица должна быть "живой".
Или это из-за области видимости переменных - таблицу создал в хранимке, после ее выполнения она и сдохла. В таком случае, как сделать "глобальную" временную таблицу?
26 май 11, 18:04    [10715434]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Они живут в скоупе, в котором созданы, и дохнут при выходе из этого скоупа. В первом случае скоуп - сессия, во втором - процедура.

Сообщение было отредактировано: 26 май 11, 18:06
26 май 11, 18:06    [10715451]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
И, да, это все хорошо описано в хелпе.
26 май 11, 18:06    [10715452]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
Гавриленко Сергей Алексеевич,

Понял. Тогда как сделать временную таблицу, которая живет всю сессию? Вариант ## как я понимаю живет во всех сессиях и умирает только после того, как таблицу отпустили все пользователи. Это так?
26 май 11, 18:09    [10715467]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
CREATE PROCEDURE [dbo].[get_val] (@p_a    nvarchar(60),
                                  @p_b nvarchar(4))  
AS
begin

	insert into #T
		(A, B)
	values
		(@p_a, @p_b); 
end
go
create table #T
(A    varchar(30),
B varchar(4));

EXEC [dbo].[get_val]
		'AAAA',
		'BBBB'

select * from #T


Сообщение было отредактировано: 26 май 11, 18:10
26 май 11, 18:10    [10715470]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
Маленькая ремарка, хочу сделать временную таблицу как в Oracle. Т.е. живущую всю сессию и уникальную для каждой сессии.
26 май 11, 18:11    [10715479]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Гришков Максим
Маленькая ремарка, хочу сделать временную таблицу как в Oracle. Т.е. живущую всю сессию и уникальную для каждой сессии.
Временные таблицы уникальны для каждой сессии. И если сделать ее без всяких процедур, она и будет жить, пока ее не удалить.
26 май 11, 18:12    [10715482]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
Гавриленко Сергей Алексеевич,

В приведенном вами примере все операции должны выполняться в рамках одного SQL, мне это не подходит.
Поясняю, OnInit страницы должен выполниться скрипт, который определит глобальные пtременные для пользователя (чтобы их не передавать при всех дальнейших запросах. Т.о. мне нужно, чтобы таблица создалась, отработала все запросы и в конце "умерла".
Как по вашему такое реально сделать?
26 май 11, 18:15    [10715499]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
Гавриленко Сергей Алексеевич
И если сделать ее без всяких процедур, она и будет жить, пока ее не удалить.

Ну как вариант, можно и без хранимки, но хотелось бы с ней =)
26 май 11, 18:17    [10715506]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Гришков Максим
Поясняю, OnInit страницы должен выполниться скрипт,
Какой еще OnInit какой еще страницы?

Гришков Максим
Т.о. мне нужно, чтобы таблица создалась, отработала все запросы и в конце "умерла".
Временные таблицы, созданные в сессии, именно так себя и ведут.

Сообщение было отредактировано: 26 май 11, 18:18
26 май 11, 18:17    [10715512]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
iljy
Member

Откуда:
Сообщений: 8711
Гришков Максим
В приведенном вами примере все операции должны выполняться в рамках одного SQL,

Че?
26 май 11, 18:19    [10715519]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
Гавриленко Сергей Алексеевич
Какой еще OnInit какой еще страницы?

OnInit - событие в при создании WEB-страницы. (Хотел объяснить зачем мне вообще это нужно.

Гавриленко Сергей Алексеевич
Временные таблицы, созданные в сессии, именно так себя и ведут.

Вот тут не понял. Если я делаю временную таблицу в хранимке, по её выполнению, таблица должна остаться живой, т.к. сессия одна и та же. Но таблица умирает - причину я уже понял.
26 май 11, 18:26    [10715547]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
iljy
Гришков Максим
В приведенном вами примере все операции должны выполняться в рамках одного SQL,

Че?


Выше был пример, где создавали ХП и выполняли запрос из временной таблицы разом. Я это и имел ввиду. Возможно неправильно выразился. Извините.
26 май 11, 18:27    [10715553]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
iljy
Member

Откуда:
Сообщений: 8711
Гришков Максим
iljy
пропущено...

Че?


Выше был пример, где создавали ХП и выполняли запрос из временной таблицы разом. Я это и имел ввиду. Возможно неправильно выразился. Извините.

А попробовать между этими двумя командами разделитель пакетов поставить не?
26 май 11, 18:28    [10715558]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iljy
А попробовать между этими двумя командами разделитель пакетов поставить не?
Что имеется в виду?
Кто будет обрабатывать этот "разделитель пакетов"?
Если я правильно понял, то уж сервер-то точно не будет.
26 май 11, 21:50    [10716105]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
iljy
Member

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

имеется ввиду, что этот скрипт явно выполняется в чем-то, понимающем go, и, добавив туда еще один go, легко убедиться, что созданная в одном пакете временная таблица прекрасно видна в другом.
26 май 11, 22:00    [10716138]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
Этот вопрос, как я понял уже активно обсуждался. Видно не один я не могу понять, почему временные таблицы в MS SQL так странно (необычно) ведут себя с точки зрения разработчика под Oracle :) (придется привыкнуть, что тут это так и точка).
Тут еще вот, что нарисовалось: почему-то нельзя делать запросы к временной таблице внутри функций. Да понимаю, этот топик тоже уже обсуждался. Читал топик, читал документацию, но так и не понял. Вот смотрите, я объявляю глобальную временную таблицу ##ttt, заполняю ее в какой-нибудь хранимке или простым инсертом. Хочу выполнить запрос, в котором вытаскиваю значения из глобальной временной таблице ##ttt (т.о. данные в ней есть и она существует на момент запроса) - все ОК. Тогда почему я не могу оформить этот запрос в функцию? Вот этого я никак не могу понять...
Буду очень признателен, если кто-нибудь доступно объяснит, почему нельзя использовать делать запросы к глобальным временным таблицам внутр функции или это стоит принять как аксиому и забыть?
27 май 11, 10:17    [10717485]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Гришков Максим
Тогда почему я не могу оформить этот запрос в функцию? Вот этого я никак не могу понять...

Потому что такое ограничение ввели разработчики mssql
27 май 11, 10:27    [10717557]     Ответить | Цитировать Сообщить модератору
 Re: Жизненный цикл временных таблиц  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
Glory
Потому что такое ограничение ввели разработчики mssql

:) Понятно, вопросов больше не имею :). Всем большое спасибо!
27 май 11, 10:30    [10717581]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить