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

Я запрашиваю свою базу данных из приложения .NET (перекодирование времени). Я отправляю имя пользователя Windows в базу данных и запрашиваю его в зависимости от этой информации.

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

Допустим, мне нужна информация из SP1, 3 и 4 на Form1:

ФОРМА1:

SP1
SP3
SP4

Моя проблема:

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

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

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

Я использую SQL Server 2014 Express.


person ruedi    schedule 16.09.2016    source источник
comment
Используйте постоянную таблицу или глобальную временную таблицу.   -  person Gordon Linoff    schedule 16.09.2016


Ответы (2)


Если вы создадите временную таблицу вне какой-либо хранимой процедуры, она будет доступна внутри каждой. Предполагая, что фактическое определение таблицы не слишком сложное (но может быть заполнение его), это может быть выполнимо.

Итак, вы бы выполнили (эффективно):

CREATE TABLE #T (A int not null, B varchar(17) not null)
EXEC PopulateTempTable
EXEC SP1
EXEC SP3
EXEC SP4

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

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

В качестве альтернативы вы можете смоделировать временные таблицы "глобального сеанса", как я предлагаю в этом ответе 1 < / sup>.

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


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

person Damien_The_Unbeliever    schedule 16.09.2016

Вам необходимо создать глобальную временную таблицу

CREATE TABLE ##TEMP1 
(
    Name varchar(50)   
)
person Sandip - Frontend Developer    schedule 16.09.2016
comment
Вы могли бы хотя бы упомянуть, что это рискованно, если одновременно будет несколько пользователей, и, возможно, предложите некоторые стратегии для снижения риска (например, включение столбца SPID в эту таблицу). - person Damien_The_Unbeliever; 16.09.2016
comment
Хорошее предложение, ваш ответ даст больше ясности - person Sandip - Frontend Developer; 16.09.2016
comment
Спасибо за комментарий, Дэмиен, так как одновременное использование нескольких пользователей является для меня актуальным сценарием. - person ruedi; 16.09.2016