Краткий ответ:
Изоляция временных таблиц гарантируется для запроса , и есть
не о чем беспокоиться в отношении потоков, блокировок или
одновременный доступ.
Я не уверен, почему ответы здесь говорят о значении «соединений» и потоков, поскольку они являются концепциями программирования, тогда как изоляция запросов обрабатывается на уровне базы данных .
Локальные временные объекты разделяются Сеанс на SQL-сервере. Если у вас есть два запроса, выполняющихся одновременно, то это два совершенно разных сеанса, которые не будут мешать друг другу. Имя входа не имеет значения, поэтому, например, если вы используете одну строку подключения с использованием ADO.NET (это означает, что несколько одновременных запросов будут использовать один и тот же SQL-сервер 'login'), все ваши запросы будут по-прежнему выполняться в отдельных сессий . Пул подключений также не имеет значения. Локальные временные объекты (таблицы и хранимые процедуры) полностью защищены от просмотра другими сеансами .
Чтобы уточнить, как это работает; в то время как ваш код имеет одно общее имя для локальных временных объектов, SQL Server добавляет уникальную строку к каждому объекту для каждого сеанса, чтобы держать их отдельно. Вы можете увидеть это, запустив в SSMS следующее:
CREATE TABLE #T (Col1 INT)
SELECT * FROM tempdb.sys.tables WHERE [name] LIKE N'#T%';
В имени вы увидите что-то вроде следующего:
T * _______________ 00000000001F 1028 *
Затем, не закрывая эту вкладку запроса, откройте новую вкладку запроса, вставьте в тот же запрос и снова запустите его. Теперь вы должны увидеть что-то вроде следующего:
T * _______________ 00000000001F * тысяча тридцать два
T * _______________ 000000000020 * 1034
Таким образом, каждый раз, когда ваш код ссылается на #T, SQL Server будет переводить его на правильное имя в зависимости от сеанса. Разделение обрабатывается автоматически.