¿Pueden dos sesiones crear tablas #temp con el mismo nombre?

16

Estoy creando una tabla temporal ( #myTable) y estoy usando un cursor. ¿Esto crea un problema cuando los usuarios concurrentes acceden al cursor a través de mi aplicación? ¿Me permite crear tablas temporales separadas con el mismo nombre?

El siguiente es el código de muestra:

Open cursor;
Fetch Next from cursor into @Variable_Temp_Table_Name;
Create table #myTable(pk int)
While @@Fetch_Status = 0
Begin    
Fetch Next from cursor into @Variable_Temp_Table_Name;
End 
sujith karivelil
fuente

Respuestas:

20

El servidor SQL siempre agrega un número aleatorio al final del nombre de una tabla temporal (detrás de escena), cuando los usuarios concurrentes crean tablas temporales en sus sesiones con el mismo nombre, el servidor sql creará varias tablas temporales en tempdb.

Creé 3 tablas temporales llamadas #TempTableen tres sesiones diferentes en mi SSMS, ahora si voy a tempdb puedo ver las tablas temporales creadas allí con una cadena aleatoria (única) añadida al nombre de cada tabla temporal.

ingrese la descripción de la imagen aquí

M.Ali
fuente
11

Sí, varias aplicaciones obtendrán sus propias copias de la tabla #temp. Ese es el punto de usar una tabla #temp, porque cada sesión concurrente tiene su propio objeto aislado. Esto no tiene nada que ver con si está usando un cursor en combinación con su tabla #temp (aunque sospecho que el cursor no es necesario de todos modos, no incluyó suficiente código para comentar específicamente).

Editar para incluir comentario:

Una cosa adicional sobre el uso de tablas #temp es que si necesita agregar restricciones, permita que el servidor SQL genere el nombre, de lo contrario, aunque la tabla sea única para la sesión, la restricción no lo hará y la segunda instancia generará un error al crear el mesa.

Aaron Bertrand
fuente
77
Una cosa adicional sobre el uso de tablas #temp es que si necesita agregar restricciones, permita que el servidor SQL genere el nombre, de lo contrario, aunque la tabla sea única para la sesión, la restricción no lo hará y la segunda instancia generará un error al crear el mesa.
Aaron
1
@ Aaron - Sugiere que mueva el comentario sobre restricciones sin nombre a la respuesta. Mucha gente se equivoca con ese detalle.
RLF
También tenga en cuenta que si alguien hace querer una tabla temporal global, que puede declarar ##likeThis.
underscore_d
@RLF y Aaron: siempre se puede generar un GUID con NEWID () y crear la restricción a través de Dynamic SQL. No digo que sea tan limpio como incluirlo en la instrucción CREATE TABLE, pero al menos es una opción. Y también creo que las restricciones FK no están permitidas en las tablas temporales (siempre que estemos hablando de restricciones genéricas).
Solomon Rutzky
@srutzky: es cierto, pero las restricciones con nombre generalmente se nombran para facilitar la referencia del código. El uso de un NEWID () no proporcionará esa simplificación, aunque puede consultar para encontrar el NEWID si es necesario.
RLF