¿Diferencia entre #temptable y ## TempTable?

83

¿Cuál es la diferencia entre #temptabley ##TempTableen SQL Server?

Vignesh Kumar A
fuente

Respuestas:

34

#tablese refiere a una tabla temporal local , visible solo para el usuario que la creó

##tablese refiere a una tabla temporal global , visible para todos los usuarios

Rahul
fuente
26

#TempTablesno 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 Executedeclaració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.

##tablesromper 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ó.

Michael Cooper
fuente
10

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.

Tomado de aqui

Más sobre esto

SamuraiJack
fuente
4

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.

goofyui
fuente
0

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ó.

agohil
fuente
0

"#" 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

  • Comienza con el valor hash único "##" como prefijo del nombre de la tabla y su nombre es siempre único.
  • No hay un número aleatorio agregado al nombre. Las tablas temporales globales son visibles para todas las conexiones de SQL Server.
  • Las tablas temporales globales solo se destruyen cuando se cierra la última conexión que hace referencia a la tabla (en la que hemos creado la tabla temporal global).
  • Puede acceder a las tablas temporales globales desde todas las conexiones de SQL Server hasta que se abra la conexión de referencia.
Samim Hussain
fuente