Ответ 1
Пул соединений (с любой современной версией SQL Server) вызовет sp_reset_connection
при повторном использовании соединения. Этот хранимый proc, среди прочего, удаляет любые временные таблицы, которыми владеет соединение.
У меня есть многопользовательское приложение ASP.NET, работающее с SQL Server, и вы хотите, чтобы StoredProcA создавал #temptable temp table - не переменную таблицы - чтобы вставлять некоторые данные, а затем в StoredProcB, StoredProcC и StoredProcD для управления данные в #temptable для бизнес-правил.
Веб-приложение использует пул соединений при разговоре с SQL. Получу ли я новую область царапин для каждого вызова StoredProcA? Или пул соединений будет использовать #temptable между пользователями?
Пул соединений (с любой современной версией SQL Server) вызовет sp_reset_connection
при повторном использовании соединения. Этот хранимый proc, среди прочего, удаляет любые временные таблицы, которыми владеет соединение.
Таблица A # будет использоваться всеми пользователями. Я предполагаю, что это не ваше намерение.
Одна-временная таблица видна для всех хранимых процедур в стеке вызовов, но не видима вне этой области. Если у вас есть Proc A для вызова B, C и D, вы должны быть в порядке.
Изменить: процедура отчетности, над которой я должен работать, сейчас очень похожа.:) Я создаю временную таблицу (#results) в корневом proc, вызванную приложением, затем выполняю некоторые сложные манипуляции данными в последовательности дочерних процедур, 1) абстрактный повторяющийся код и 2) не запускает корневую процедуру до 500 строк.
#temptable
не переживает конца процедуры, в которой он был объявлен, поэтому он никогда не увидит других пользователей.
Изменить: Хе, выясняется, что "временная видимость" временных таблиц работает с SQL Server 7.0, но я никогда не обновлял ни один из моих кодов, чтобы воспользоваться этим. Наверное, я встречаюсь со мной - многие люди, вероятно, не могут представить себе ад, который был SQL Server в 6,0 и 6,5 днях...
Из документов 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
Если вы создаете локальную временную таблицы внутри хранимой процедуры, временная таблица существует только для цели хранимой процедуры; Это исчезает при выходе из сохраненного Процедура.
Если вы выполните хранимую процедуру который вызывает другую хранимую процедуру, вызываемая хранимая процедура может доступ ко всем объектам, созданным первой хранимой процедуры, включая временные таблицы.
Чтобы разделить временную таблицу между пользователями, используйте два хэша перед именем ## like_this.
В этом случае убедитесь, что вы предпринимаете шаги, чтобы избежать столкновений с несколькими экземплярами программы.
Я считаю, что взаимодействие временных столов/сессий/соединений/пулов соединений довольно запутывает...:( Марк, ваше выражение является одним из самых ясных, что я нашел, делая много исследований Google и MSDN. Тем не менее, я хотел бы узнать источник вашего заявления.
И может кто-нибудь объяснить разницу между сеансом и связью со мной? Я не мог найти никаких серьезных фактов.
Кажется, что в терминологии есть проблема, я думаю: если вы "закрываете" соединение, оно может быть выпущено в пул соединений, поэтому соединение остается (на какое-то время) открытым... arghs... Как вы можете различать один вкус близкого и другого аромата близкого?!
Таблицы темпов создаются с помощью манипулирования именами под капотом, поэтому не должно быть конфликтов между различными вызовами хранимых процедур.
Если вам нужно манипулировать одними и теми же временными данными в последующих вызовах хранимых процедур, лучше всего просто пойти с реальной таблицей и использовать какой-то уникальный идентификатор, чтобы убедиться, что вы имеете дело только с соответствующими данными. Если данные временно ценны, вручную удалите их, как только вы закончите.
Просто попробовал поисковый запрос sp_reset_connection в Google. Это может быть полезно: http://www.sqldev.net/misc/sp_reset_connection.htm