Как обратиться к глобальной временной таблице из другого сеанса?
Глобальные временные таблицы видны во всех сеансах. Глобальные временные таблицы автоматически удаляются при завершении сеанса, создавшего таблицу, и прекращении обращения к ним всех прочих задач. Каким образом можно воспользоваться глобальной временной таблицей из другого сеанса? Например, в одной хранимой процедуре создалась глобальная временная таблица и поместились данные в эту таблицу, а из других процедур идёт обращение к глобальной временной таблице
CREATE PROCEDURE dbo.Test2 AS CREATE TABLE ##t(Test1Col int); INSERT INTO ##t VALUES (2); GO
Обращаемся к глобальной временной таблице из другой процедуры:
CREATE PROCEDURE dbo.Test1 AS SELECT Test1Col FROM ##t; GO
Возможно ли это вообще? Если нет, то есть ли какие-нибудь другие решения? Или, может быть, возможно сделать так, чтобы таблица не удалялась при завершении сеанса?
Отслеживать
8,531 2 2 золотых знака 22 22 серебряных знака 35 35 бронзовых знаков
задан 9 мар 2016 в 14:37
300 4 4 серебряных знака 17 17 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Глобальные временные таблицы автоматически удаляются при завершении сеанса, создавшего таблицу, и прекращении обращения к ним всех прочих задач.
Всё верно. Если ## таблица создаётся в одной сессии, и доступ к ней осуществляется из других сессий, то в них она доступна, пока первая сессия не закрылась или к ## таблице есть обращение из этих других сессий. Причём важно, есть ли обращения именно в данный момент времени, а не будут ли они когда-нибудь потом.
Как это действует можно видеть на следующем примере. Создадим одновременно две сессии.
Сессия 1
CREATE TABLE ##t (Test1Col int); INSERT INTO ##t VALUES (2);
и оставим эту сессию пока открытой.
Сессия 2
SELECT * FROM ##t
Получим данные, которыми мы заполнили таблицу в Сессии 1, как и полагается. Теперь в Сессии 2 выполним:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ BEGIN TRANSACTION SELECT * FROM ##t
это вызовет блокировку ##t (то самое «есть обращение»).
Сессию 1 теперь закроем, а в Сессии 2 выполним:
SELECT * FROM ##t -- ok COMMIT TRANSACTION SELECT * FROM ##t -- error
Хотя Сессия 1, в которой была создана ## таблица уже закрыта, первая выборка пройдёт успешно, т.к. ##t была нами захвачена в Сессии 2. После завершения транзакции ( COMMIT ) в Сессии 2 произойдёт освобождение ##t , а т.к. её сессия-инициатор уже закрыта, то ##t тут же будет удалена. Соответственно, вторая выборка завершится уже с ошибкой.
Каким образом можно воспользоваться глобальной временной таблицей из другого сеанса?
Так как вы и делаете это, но, как видно из примера выше, есть некоторые нюансы, касающиеся жизненного цикла ## таблиц.
В зависимости от ситуации, возможны следующие варианты:
- Удерживать сессию, создавшую ## таблицу, открытой на время доступа к ней из других сессий. Это, наверное, наиболее простой и наименее проблемный вариант, если, конечно, архитектура приложения позволяет его использовать.
- Можно создать ## таблицу в одной сессии, затем в другой сессии произвести её захват, установив приемлемую блокировку, после чего сессия, создавшая ## таблицу, может быть закрыта.
- В некоторых случаях логика приложения может позволять делать проверку существования/создание/заполнение ## таблицы в каждой сессии, где это необходимо. В этом случае инициирующий код можно вынести в отдельную процедуру и исполнять по-необходимости в каждой такой сессии.
- Если перечисленные выше варианты не подходят, то это может быть знаком того, что с помощью ## таблиц вы пытаетесь решить задачу, которую на самом деле следует решать, используя постоянные таблицы.
- Существует также некоторая альтернатива между ## и постоянными таблицами — это создание постоянных таблиц в tempdb (они будут существовать до следующего рестарта SqlServer). Однако лично мне такой способ кажется «грязным».
Где хранятся временные таблицы MS SQL: лучший способ сохранения временных данных
Где хранятся временные таблицы MS SQL? Временные таблицы в MS SQL хранятся в tempdb базе данных. Tempdb база данных является системной базой данных, которая используется для хранения временных объектов, таких как временные таблицы, переменные таблицы и таблицы переменных. Она автоматически создается каждый раз при запуске SQL Server и удаляется при его остановке. Временные таблицы могут быть локальными или глобальными. Локальные временные таблицы видимы только внутри текущей сессии подключения, а глобальные временные таблицы видимы для всех сеансов подключения в рамках данного сервера. Вот пример создания временной таблицы в MS SQL:
CREATE TABLE #temp ( id INT, name VARCHAR(50) );
Временная таблица с префиксом «#» создается как локальная временная таблица. Вы можете использовать эту временную таблицу в пределах текущей сессии подключения.
CREATE TABLE ##temp ( id INT, name VARCHAR(50) );
Временная таблица с префиксом «##» создается как глобальная временная таблица. Вы можете использовать эту временную таблицу в разных сеансах подключения на данном сервере. Надеюсь, эта информация была полезной! Если у вас возникнут еще вопросы, не стесняйтесь задавать!
Детальный ответ
Где хранятся временные таблицы MS SQL?
Временные таблицы являются важным инструментом в MS SQL Server, позволяющим хранить временные данные во время выполнения запросов. Они обладают определенной областью видимости и жизненным циклом, что делает их полезными во многих сценариях.
Виды временных таблиц
В MS SQL Server существуют два вида временных таблиц: локальные и глобальные. Рассмотрим их подробнее:
1. Локальные временные таблицы
Локальные временные таблицы создаются с префиксом # и видны только в рамках текущей сеансовой области видимости пользователя, который создал таблицу. Когда пользователь закрывает сеанс, локальные временные таблицы автоматически удаляются. Временные таблицы этого типа создаются с помощью оператора CREATE TABLE:
CREATE TABLE #TempTable ( ID INT, Name VARCHAR(50) )
Локальные временные таблицы можно использовать внутри хранимых процедур, функций и блоков кода. Они отлично подходят для временного хранения промежуточного результата при выполнении сложных запросов.
2. Глобальные временные таблицы
Глобальные временные таблицы создаются с префиксом ## и видны всем пользователям базы данных. Они сохраняются до тех пор, пока последний пользователь не закроет последнюю открытую транзакцию. Глобальные временные таблицы также создаются с помощью оператора CREATE TABLE:
CREATE TABLE ##GlobalTempTable ( ID INT, Name VARCHAR(50) )
Глобальные временные таблицы могут быть полезны при необходимости передавать данные между различными сеансами пользователей, так как они видимы для всех пользователей. Однако, следует быть внимательным при использовании глобальных временных таблиц, так как они могут привести к конфликтам и ошибкам при одновременном использовании несколькими пользователями.
Место хранения временных таблиц
Начиная с MS SQL Server 2016, локальные временные таблицы хранятся в той же файловой группе, что и системная база данных TEMPDB. Системная база данных TEMPDB является предварительно созданной базой данных, используемой SQL Server для временного хранения данных, таких как временные таблицы, переменные и т.д. TEMPDB может быть изменена и оптимизирована для достижения максимальной производительности временных таблиц. Глобальные временные таблицы также хранятся в системной базе данных TEMPDB. Они имеют уникальное имя в рамках всей базы данных, чтобы избежать конфликтов между различными сеансами пользователей.
Пример использования временных таблиц
Давайте рассмотрим пример использования временных таблиц в MS SQL Server:
-- Создание локальной временной таблицы CREATE TABLE #Students ( ID INT, Name VARCHAR(50), Age INT ) -- Вставка данных во временную таблицу INSERT INTO #Students (ID, Name, Age) VALUES (1, 'John', 25), (2, 'Alice', 23), (3, 'Bob', 27) -- Выборка данных из временной таблицы SELECT * FROM #Students -- Удаление временной таблицы DROP TABLE #Students
В данном примере мы создаем локальную временную таблицу с именем #Students, вставляем в нее данные, выбираем данные из нее и затем удаляем таблицу при помощи оператора DROP TABLE. Это демонстрирует базовые операции с временными таблицами в MS SQL Server.
Заключение
Временные таблицы являются мощным инструментом в MS SQL Server для временного хранения данных во время выполнения запросов. Локальные временные таблицы видны только в рамках текущей сеансовой области видимости пользователя, а глобальные временные таблицы видны всем пользователям базы данных. Локальные временные таблицы хранятся в системной базе данных TEMPDB, а глобальные временные таблицы также используют TEMPDB для хранения данных. Используйте временные таблицы, когда вам нужно сохранить временные данные или выполнить сложные операции в MS SQL Server. Запомните, что они полезны, но следует использовать их с осторожностью для избежания возможных проблем с конфликтами и ошибками.
Получение названий полей из временной таблицы в SQL Server
Для получения имен полей временной таблицы в SQL Server можно следующую команду:
Скопировать код
SELECT COLUMN_NAME FROM tempdb.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE '#TempTable%';
Не забывайте заменить #TempTable на название вашей временной таблицы. Данная команда напрямую обращается к базе данных tempdb, где хранятся временные таблицы.
Основы и то, что за ними скрывается
Сведения о полях таблицы крайне важны. Получим более подробную информацию, объединив таблицы tempdb.sys.columns и tempdb.sys.types:
Скопировать код
SELECT c.name AS ColumnName, t.name AS DataType, c.max_length, c.is_nullable FROM tempdb.sys.columns AS c INNER JOIN tempdb.sys.types AS t on c.system_type_id = t.system_type_id WHERE c.object_id = OBJECT_ID(N'tempdb..#YourTempTable');
Таким образом, вы получите не только названия полей, но и информацию о типах данных, возможности хранения NULL и других свойствах.
В поисках Дори или object_id
Для надёжного определения object_id временной таблицы используйте следующую команду:
Скопировать код
SELECT OBJECT_ID(N'tempdb..#YourTempTable');
Обратите внимание, что таблицы с одной решёткой (#) являются сессионными и имеют уникальный object_id для каждой сессии. Таблицы с двойной решёткой (##) видны глобально и имеют один и тот же object_id для всех сессий.
Использование INFORMATION_SCHEMA.COLUMNS рекомендуется при написании кода, зависящего от структуры данных.
Внимание: возможны столкновения
В многопользовательской среде существует опасность конфликта сессий, когда разные пользователи создают временные таблицы с одинаковыми названиями. Это может привести к непредсказуемым результатам. Для избежания этого рекомендуется использовать уникальные суффиксы в названиях временных таблиц.
Получение полей с помощью хранимых процедур
Для создания более универсального инструмента можно воспользоваться хранимой процедурой SQL Server sp_columns:
Где хранятся временные таблицы SQL Server
Временные таблицы в SQL Server могут быть сохранены в двух различных местах: внутри оперативной памяти или на диске. Если временная таблица имеет небольшой объем данных и недолговечна, то она будет храниться в оперативной памяти. Это обеспечивает быстрый доступ к данным и улучшает производительность запросов. Временные таблицы в памяти помечаются с помощью префикса ‘#’ или ‘##’ в их названии. Однако, если временная таблица содержит большой объем данных или должна сохраниться между серверными вызовами, она будет храниться на диске. SQL Server сохраняет эти таблицы в системной базе данных tempdb. Временные таблицы на диске помечены с помощью префикса ‘#temp’ в их названии. Вот примеры создания временных таблиц в SQL Server:
-- Временная таблица в памяти CREATE TABLE #InMemoryTable ( ID INT PRIMARY KEY, Name VARCHAR(50) ) -- Временная таблица на диске CREATE TABLE #tempDiskTable ( ID INT PRIMARY KEY, Name VARCHAR(50) )
Детальный ответ
Где хранятся временные таблицы SQL Server?
SQL Server предоставляет различные типы таблиц для сохранения данных. Один из таких типов таблиц — временные таблицы. Временные таблицы могут быть полезными при выполнении сложных запросов или временной обработки данных. Они обычно используются для хранения промежуточных результатов, которые могут быть использованы позже в процессе выполнения запроса.
Типы временных таблиц:
В SQL Server есть два типа временных таблиц: локальные временные таблицы и глобальные временные таблицы.
1. Локальные временные таблицы:
Локальная временная таблица существует только в пределах текущей сесии пользователя. Она доступна только для этого пользователя и удаляется после закрытия сессии. Имя временной таблицы начинается с символа ‘#’.
Пример создания локальной временной таблицы:
CREATE TABLE #TempTable ( ID INT, Name VARCHAR(50) );
2. Глобальные временные таблицы:
Глобальная временная таблица существует в пределах всех сессий пользователей. Она доступна для всех пользователей и удаляется после закрытия последней сессии, которая ее использует. Имя временной таблицы начинается с символов ‘##’.
Пример создания глобальной временной таблицы:
CREATE TABLE ##TempTable ( ID INT, Name VARCHAR(50) );
Где хранятся временные таблицы?
Теперь когда мы поняли различия между локальными и глобальными временными таблицами, давайте разберемся, где они хранятся. Когда вы создаете локальную временную таблицу, SQL Server создает специальную системную таблицу в базе данных tempdb для хранения данных этой временной таблицы. Эта системная таблица имеет уникальное имя, которое генерируется SQL Server и связано с вашей локальной временной таблицей. Аналогично, когда вы создаете глобальную временную таблицу, SQL Server также создает системную таблицу в базе данных tempdb для хранения данных этой временной таблицы. Только в этом случае системная таблица имеет имя, которое начинается с символов ‘##’ и также связана с вашей глобальной временной таблицей. Обратите внимание, что данные временных таблиц хранятся в базе данных tempdb, которая является системной базой данных SQL Server. Она автоматически создается при установке SQL Server и используется для временных объектов и других системных операций базы данных. Tempdb также используется другими функциями SQL Server, такими как сортировка и соединение данных.
Завершение
Временные таблицы — полезный инструмент в SQL Server для хранения промежуточных результатов и обработки временных данных. Они бывают локальными и глобальными, и хранятся в системной базе данных tempdb. Теперь, когда вы знаете, где хранятся временные таблицы, вы можете легко использовать их в своих SQL-запросах и проектах.