Сессионные глобальные временные таблицы в SQL Server - PullRequest
1 голос
/ 07 марта 2011

В SQL Server временные таблицы с именем типа #temp имеют локальную область.Если вы создаете их в своем сеансе, все в вашем сеансе может видеть их, но не за пределами вашего сеанса.Если вы создаете такую ​​таблицу в хранимой процедуре, область действия является локальной для этой процедуры.Поэтому, когда процесс завершается, таблица исчезает.

Единственная известная мне альтернатива - использовать таблицы с именем, подобным ## temp.Это временные, но видимые для всего сервера.Поэтому, если я создам таблицу в моем сеансе, Боб в соседнем офисе также увидит их.

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

Ответы [ 4 ]

4 голосов
/ 07 марта 2011

Еще один ключ, который может работать для вас - это зависит от того, сколько временных таблиц здесь задействовано.

Создайте свои временные таблицы как реальные таблицы с дополнительным столбцом под названием SPID, по умолчанию @@SPID.

Затем создайте представление, которое обращается к этим таблицам, но фильтрует их по значению @@SPID.Все операции, выполняемые через это представление, должны выглядеть так, как будто они изолированы для каждого сеанса.Например:

create table temp_Boris (
    SPID int default @@SPID,
    ColA int,
    ColB varchar(10)
)
go
create view vBoris
as
    select ColA,ColB from temp_Boris where SPID = @@SPID
go

Затем на одном соединении выполните следующее:

insert into vBoris(ColA,ColB)
select 10,'abc' union all
select 20,'def'
go
select * from vBoris

А на другом соединении выполните следующее:

insert into vBoris(ColA,ColB)
select 10,'abc' union all
select 20,'def'
go
select * from vBoris
select * from temp_Boris
go
delete from vBoris
go
select * from vBoris
select * from temp_Boris

И выВы увидите, что каждое соединение может обрабатывать «vBoris» в некоторой степени как временную таблицу - конечно, вам может понадобиться добавить дополнительные подпрограммы вокруг этого (и, возможно, больше столбцов) для очистки таблицы старых / устаревших результатов.

Хорошо, я признаю, это тоже ужасно.

2 голосов
/ 07 марта 2011

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

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

Сказав это, вы можете сохранить небольшие объемы (128 байт) данных для открытого соединения для только для этого соединения , используя CONTEXT_INFO .

1 голос
/ 07 марта 2011

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

0 голосов
/ 07 марта 2011

Я не думаю, что в SQL Server есть готовое решение для того, что вам нужно.я думаю, что единственный способ - управлять им самостоятельно.Допустимо ли вам создавать обычную таблицу с некоторым суффиксом вместо таблицы BLOBAL (где у вас есть контроль над ее полным именем)?поскольку глобальные таблицы попадают в базу данных tempdb, это также поможет вам изолировать данные в вашей базе данных в качестве побочного эффекта.

...