Таблицы временных параметров SQL Server и пулы подключений

У меня есть многопользовательское приложение ASP.NET, работающее с SQL Server, и я хочу, чтобы StoredProcA создал временную таблицу #temptable, а не табличную переменную, чтобы вставить некоторые данные, а затем перейти к StoredProcB, StoredProcC и StoredProcD для управления данными в # соблазнительно в соответствии с бизнес-правилами.

Веб-приложение использует пул соединений при разговоре с SQL. Получу ли я новую #temptable рабочую область при каждом вызове StoredProcA? Или пул соединений будет разделять #temptable между пользователями?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
33
0
14 680
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Чтобы разделить временную таблицу между пользователями, используйте два хэша перед именем ## like_this.

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

Таблица ## будет доступна всем пользователям. Я полагаю, это не твое намерение.

Таблица single- # temp видна для всех хранимых процедур в стеке вызовов, но не видна за пределами этой области. Если вы можете получить вызовы B, C и D Proc A, все будет в порядке.

Обновлено: процедура отчетности, над которой я должен работать прямо сейчас, очень похожа на это. :) Я создаю временную таблицу (#results) в корневом процессе, который вызывается приложением, затем выполняю некоторые сложные манипуляции с данными в серии дочерних процедур, чтобы 1) абстрагировать повторяющийся код и 2) не позволять запускать корневую процедуру до 500+ строк.

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

Kevin Crumley 27.09.2008 00:58

#temptable не доживает до конца процедуры, в которой он был объявлен, поэтому его никогда не увидят другие пользователи.

Редактировать: Хех, оказывается, «видимость вложенности» временных таблиц работает с SQL Server 7.0, но я никогда не обновлял свой код, чтобы воспользоваться этим. Думаю, я встречаюсь с самим собой - многие люди, вероятно, не могут представить, какого черта был SQL Server в дни 6.0 и 6.5 ...

#temptable имеет область подключения, а не объем процедуры.

Amy B 27.09.2008 00:28

И вот ссылка на это: decipherinfosys.wordpress.com/2007/05/04/…

Curt Hagenlocher 27.09.2008 00:29

Я вижу, таблицы #temp, созданные на уровне сценария, отличаются от таблиц #temp, созданных внутри хранимых процедур. Спасибо.

Amy B 27.09.2008 00:31

Но это все равно будет видно в вызываемых процедурах! :)

Amy B 27.09.2008 00:33

Я думаю, что Дэвид Б. прав. См. Мой пример. mooredynasty.com/Blog/…

marc 27.09.2008 00:37

@Curt - Я набил зубы на SQL 6.5, разработчики не знают, насколько он у них хорош :)

Kev 27.09.2008 00:54

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

Triynko 26.02.2015 00:29

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

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

Ответ принят как подходящий

Пул соединений (с любой современной версией SQL Server) будет вызывать sp_reset_connection при повторном использовании соединения. Эта хранимая процедура, среди прочего, удаляет все временные таблицы, которой владеет соединение.

Хорошо, теперь это утверждение имеет для меня смысл: «Когда перед таблицей стоит один знак« # », она определяется как локальная временная таблица, и ее область действия ограничена сеансом, в котором она создается». Слово «сессия» меня озадачило!

marc 27.09.2008 00:45

Как насчет глобально видимых временных таблиц (## tableName)?

Andrei Rînea 28.09.2008 16:25

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

Mark Brackett 28.09.2008 20:05

Из документов MS:

http://msdn.microsoft.com/en-us/library/ms177399(SQL.90).aspx

Временные столы

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

Есть два типа временных таблиц: локальные и глобальные. Они отличаются друг от друга своими именами, видимостью и доступностью.Локальные временные таблицы имеют один знак номера (#) в качестве первого символа их имен; они видны только текущему соединению для пользователя и удаляются, когда пользователь отключается от экземпляра SQL Server.

Глобальные временные таблицы имеют два знака числа (##) в качестве первых символов их имен; они видны любому пользователю после их создания и удаляются, когда все пользователи, ссылающиеся на таблицу, отключаются от экземпляра SQL Server.

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

Дополнительно от Курт, который исправил ошибку моими способами и на случай, если вы пропустите цитату в комментарии:

http://msdn.microsoft.com/en-us/library/ms191132.aspx

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

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

В частности, он сказал, что использует хранимые процедуры. То, что вы говорите, верно, если временная таблица находится на «верхнем уровне» соединения, но когда она используется внутри хранимой процедуры, она автоматически удаляется в конце. Поищу ссылку в официальной документации.

Curt Hagenlocher 27.09.2008 00:55

«Если вы создаете локальную временную таблицу внутри хранимой процедуры, временная таблица существует только для целей хранимой процедуры; она исчезает при выходе из хранимой процедуры». @ msdn.microsoft.com/en-us/library/ms191132.aspx

Curt Hagenlocher 27.09.2008 00:58

Другие вопросы по теме