¿Cuál es la diferencia entre #temptable
y ##TempTable
en SQL Server?
fuente
¿Cuál es la diferencia entre #temptable
y ##TempTable
en SQL Server?
#table
se refiere a una tabla temporal local , visible solo para el usuario que la creó
##table
se refiere a una tabla temporal global , visible para todos los usuarios
#TempTables
no son solo locales para el usuario o la conexión. Son locales del proceso que los creó y de cualquier proceso que genere el proceso de creación. Por ejemplo, si tengo lo siguiente:
Declare @strDynamicSQL as varchar(8000)
Set @strDynamicSQL = 'Select GetDate() As TheDate Into #TheDateTable'
Execute(@strDynamicSQL)
Select *
From #TheDateTable
Obtuve el siguiente error:
Msg 208, nivel 16, estado 0, línea 7 Nombre de objeto no válido '#TheDateTable'.
Pero si lo hago:
Declare @strDynamicSQL as varchar(8000)
Create Table #TheDateTable (
TheDate DateTime
)
Set @strDynamicSQL = 'Insert Into #TheDateTable Select GetDate() As TheDate'
Execute(@strDynamicSQL)
Select *
From #TheDateTable
No obtengo errores.
En el primer ejemplo, la Execute
declaración ocurre en un proceso generado. Dado que la tabla se crea en ese proceso cuando regresa, ese proceso desaparece. Y con el proceso la mesa es "bye-bye".
En el segundo ejemplo, la tabla se crea mediante el proceso de nivel superior. Luego se interactúa con él en el proceso generado. La tabla está disponible para el proceso en el que se creó y cualquier proceso que genere.
##tables
romper esto. El proceso en el que ##
se crea una tabla será el proceso de control. La tabla no se marcará para su eliminación si este proceso aún está activo, incluso si no hay tareas en ese proceso. Una vez que el proceso en el que ##
se creó la tabla desaparece, la tabla se etiqueta para su eliminación cuando se ejecuta la última tarea en su contra.
Aquí tienes una forma sencilla de verlo. #
Las tablas están disponibles solo en el ámbito del proceso en el que se crearon. ##
Están disponibles de la misma manera que cualquier otra tabla, excepto que la existencia va y viene con el proceso en el que se creó.
Las tablas temporales locales solo son visibles para sus creadores durante la misma conexión a una instancia de SQL Server que cuando se crearon o se hizo referencia a las tablas 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.
forma sencilla de probar #localtable and ##globaltable
Pruebe esto en una ventana de consulta SQL diferente
create table ##globaltemptable (id int )
go
insert into ##globaltemptable values (1)
go
select * from ##globaltemptable
Pruebe esto en una ventana de consulta SQL diferente
create table #localtemptable (id int )
go
insert into #localtemptable values (1)
go
select * from #localtemptable
Ahora, si ejecuta la consulta de selección para la tabla: #localtemptable en la sintaxis de la ventana global, obtendrá un error de la siguiente manera:
Invalid object name '#localtemptable'.
Mientras ejecuta la consulta de selección para la tabla: ## globaltemptable en cualquier ventana de consulta de la misma sesión, obtendrá los resultados de la consulta.
La tabla estará visible / disponible hasta que finalice el proceso / conexión que la creó y solo hasta la sesión que la creó.
La tabla es global y estará disponible para todos hasta que finalice el proceso / sesión que la creó.
"#" indica tablas temporales locales
Comienza con un solo valor hash "#" como prefijo del nombre de la tabla.
Una tabla temporal local es solo para la conexión en la que se
creó. Cada tabla temporal local tiene un valor aleatorio al final del nombre de la tabla.
Una tabla temporal local se elimina automáticamente cuando se cierra la conexión existente, o el usuario puede eliminarla explícitamente con el siguiente comando "eliminar tabla #TempTable".
Si la tabla temporal se crea en un procedimiento almacenado, se descarta automáticamente al completar la ejecución del procedimiento almacenado.
Puede crear una tabla temporal local con el mismo nombre pero en una conexión diferente, y se almacena con el mismo nombre junto con varios valores aleatorios.
"##" denota tablas temporales globales