Подтвердить что ты не робот

Таблицы SQL Server Temp и пул соединений

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

Изменить: Хе, выясняется, что "временная видимость" временных таблиц работает с SQL Server 7.0, но я никогда не обновлял ни один из моих кодов, чтобы воспользоваться этим. Наверное, я встречаюсь со мной - многие люди, вероятно, не могут представить себе ад, который был SQL Server в 6,0 и 6,5 днях...

Ответ 4

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

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

Временные таблицы

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

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

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

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

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

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

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

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

Ответ 5

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

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

Ответ 6

Я считаю, что взаимодействие временных столов/сессий/соединений/пулов соединений довольно запутывает...:( Марк, ваше выражение является одним из самых ясных, что я нашел, делая много исследований Google и MSDN. Тем не менее, я хотел бы узнать источник вашего заявления.

И может кто-нибудь объяснить разницу между сеансом и связью со мной? Я не мог найти никаких серьезных фактов.

Кажется, что в терминологии есть проблема, я думаю: если вы "закрываете" соединение, оно может быть выпущено в пул соединений, поэтому соединение остается (на какое-то время) открытым... arghs... Как вы можете различать один вкус близкого и другого аромата близкого?!

Ответ 7

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

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