¿Cuál es la diferencia entre las tablas temporales locales y globales en SQL Server?
¿Cuál es la diferencia entre las tablas temporales locales y globales en SQL Server?
Respuestas:
Encuentro esta explicación bastante clara (es pura copia de Technet ):
Hay dos tipos de tablas temporales: local y global. Las tablas temporales locales solo son visibles para sus creadores durante la misma conexión a una instancia de SQL Server que cuando las tablas se crearon o referenciaron por primera vez. Las tablas temporales locales se eliminan después de que el usuario se desconecta de la instancia de SQL Server. Las tablas temporales globales son visibles para cualquier usuario y cualquier conexión después de su creación, y se eliminan cuando todos los usuarios que hacen referencia a la tabla se desconectan de la instancia de SQL Server.
Las variables de tabla ( DECLARE @t TABLE
) son visibles solo para la conexión que lo crea y se eliminan cuando finaliza el procedimiento por lotes o almacenado.
Las tablas temporales locales ( CREATE TABLE #t
) son visibles solo para la conexión que la crea y se eliminan cuando se cierra la conexión.
Las tablas temporales globales ( CREATE TABLE ##t
) son visibles para todos y se eliminan cuando se cierran todas las conexiones a las que se hace referencia.
Las tablas permanentes de Tempdb ( USE tempdb CREATE TABLE t
) son visibles para todos y se eliminan cuando se reinicia el servidor.
1.) Una tabla temporal local existe solo para la duración de una conexión o, si se define dentro de una declaración compuesta, para la duración de la declaración compuesta.
Las tablas temporales locales solo están disponibles para la sesión o conexión de SQL Server (es decir, un solo usuario) que creó las tablas. Estos se eliminan automáticamente cuando la sesión que creó las tablas se ha cerrado. El nombre de la tabla temporal local se observa con un signo de hash único ("#").
CREATE TABLE #LocalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp
El alcance de la tabla temporal local existe para la sesión actual del usuario actual significa para la ventana de consulta actual. Si cierra la ventana de consulta actual o abre una nueva ventana de consulta e intenta encontrar la tabla temporal creada anteriormente, le dará el error.
2.) Una tabla temporal global permanece en la base de datos de forma permanente, pero las filas solo existen dentro de una conexión determinada. Cuando se cierra la conexión, los datos en la tabla temporal global desaparecen. Sin embargo, la definición de la tabla permanece con la base de datos para acceder cuando la base de datos se abra la próxima vez.
Las tablas temporales globales están disponibles para todas las sesiones o conexiones de SQL Server (significa todo el usuario). Estos pueden ser creados por cualquier usuario de conexión de SQL Server y se eliminan automáticamente cuando se han cerrado todas las conexiones de SQL Server. El nombre de la tabla temporal global se observa con el signo de doble hash ("##").
CREATE TABLE ##GlobalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp
Las tablas temporales globales son visibles para todas las conexiones de SQL Server, mientras que las tablas temporales locales son visibles solo para la conexión actual de SQL Server.
Citando libros en línea:
Las tablas temporales locales solo son visibles en la sesión actual; Las tablas temporales globales son visibles para todas las sesiones.
Las tablas temporales se eliminan automáticamente cuando salen del alcance, a menos que se eliminen explícitamente usando DROP TABLE:
Tablas temporales locales : si crea tablas temporales locales y luego abre otra conexión e intenta la consulta, obtendrá el siguiente error.
solo se puede acceder a las tablas temporales dentro de la sesión que las creó.
Tablas temporales globales : a veces, es posible que desee crear una tabla temporal que sea accesible para otras conexiones. En este caso, puede usar tablas temporales globales.
Las tablas temporales globales solo se destruyen cuando se cierran todas las sesiones que se refieren a ella.
Vale la pena mencionar que también hay: tablas temporales globales con ámbito de base de datos (actualmente solo es compatible con Azure SQL Database).
Las tablas temporales globales para SQL Server (iniciadas con ## nombre de tabla) se almacenan en tempdb y se comparten entre todas las sesiones de los usuarios en toda la instancia de SQL Server.
Azure SQL Database admite tablas temporales globales que también se almacenan en tempdb y tienen un alcance al nivel de la base de datos. Esto significa que las tablas temporales globales se comparten para todas las sesiones de los usuarios dentro de la misma base de datos Azure SQL. Las sesiones de usuario de otras bases de datos no pueden acceder a tablas temporales globales.
-- Session A creates a global temp table ##test in Azure SQL Database testdb1 -- and adds 1 row CREATE TABLE ##test ( a int, b int); INSERT INTO ##test values (1,1); -- Session B connects to Azure SQL Database testdb1 -- and can access table ##test created by session A SELECT * FROM ##test ---Results 1,1 -- Session C connects to another database in Azure SQL Database testdb2 -- and wants to access ##test created in testdb1. -- This select fails due to the database scope for the global temp tables SELECT * FROM ##test ---Results Msg 208, Level 16, State 0, Line 1 Invalid object name '##test'
ALTERAR BASE DE DATOS CONFIGURACIÓN ALCANZADA
GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }
SE APLICA A: Azure SQL Database (la característica está en vista previa pública)
Permite configurar la funcionalidad de caída automática para tablas temporales globales. El valor predeterminado es ON, lo que significa que las tablas temporales globales se descartan automáticamente cuando no están en uso en ninguna sesión. Cuando se establece en OFF, las tablas temporales globales deben eliminarse explícitamente utilizando una instrucción DROP TABLE o se eliminarán automáticamente al reiniciar el servidor.
Con las bases de datos únicas de Azure SQL Database y los grupos elásticos, esta opción se puede configurar en las bases de datos de usuarios individuales del servidor de SQL Database. En SQL Server y la instancia administrada de Azure SQL Database, esta opción se establece en TempDB y la configuración de las bases de datos de usuarios individuales no tiene ningún efecto.
No vi ninguna respuesta que muestre a los usuarios dónde podemos encontrar una tabla Global Temp. Puede ver las tablas temporales locales y globales en la misma ubicación al navegar dentro de SSMS. Captura de pantalla a continuación tomada de este enlace .
Bases de datos -> Bases de datos del sistema -> tempdb -> Tablas temporales