2009-05-21 11 views
46

He leído sobre el tema de las tablas temporales y el alcance y todas las respuestas que he visto no parecen hablar de una de mis preocupaciones.SQL Server 2005 y ámbito de tabla temporal

Entiendo que el alcance de una tabla temporal local solo es válido durante la vigencia de un procedimiento almacenado o procedimientos almacenados secundarios. Sin embargo, cuál es la situación con respecto a la concurencia. es decir, si tengo un procedimiento almacenado que crea una tabla temporal que se llama desde dos procesos diferentes pero desde el mismo usuario/cadena de conexión, esa tabla temporal se compartirá entre las dos llamadas a ese procedimiento almacenado o será un caso de cada llamada al procedimiento almacenado crea una instancia de tabla temporal única.

Supongo que la tabla temporal pertenece al alcance de la llamada a la proposición almacenada, pero quiero estar seguro antes de ir por un camino con esto.

Respuesta

76

Las tablas temporales locales (comienzan con #) se limitan a su sesión; otras sesiones, incluso desde la misma cadena de usuario/conexión, no pueden verlas. Las reglas de por vida dependen de si la tabla temporal local se creó en un procedimiento almacenado:

  • Una tabla temporal local que se crea en un procedimiento almacenado se elimina cuando finaliza el procedimiento; otros procedimientos almacenados, o el proceso de llamada, no pueden verlos.
  • Otras tablas temporales locales se eliminan cuando finaliza la sesión.

Las tablas temporales globales (comienzan con ##) se comparten entre sesiones. Se dejan caer cuando:

  • La sesión que los creó termina
  • Y hay otra sesión se está refiriendo a ellos

Este comando puede ser útil para ver qué existen las tablas temporales:

select TABLE_NAME from tempdb.information_schema.tables 

Y esto es útil para colocar tablas temporales si no está seguro de que existan:

if object_id('tempdb..#SoTest') is not null drop table #SoTest 

Consulte este MSDN article para obtener más información.

+0

+1 Esta es una respuesta increíble. ¿Puedes confirmar esto? Si un procedimiento almacenado se ejecuta varias veces desde la misma cadena de conexión, la última declaración 'if object_id ...' determina la existencia de una tabla temporal en la sesión desde la que se está llamando. Es mi entendimiento correcto? Entiendo que las sesiones no sabrán la existencia de tablas temporales, pero me pregunto si el 'object_id' devuelve el valor basado en una sesión. – Legend

+0

@Legend: 'object_id' solo debería ver tablas temporales de su propia sesión. Debería ser fácil de probar. – Andomar

+0

+1 Sí, solo lo revisé yo también. Realmente aprecio tu respuesta. Gracias. – Legend

11

La tabla temporal será accesible a la instancia del procedimiento que

crea la siguiente secuencia de comandos

Exec ('Select 1 as col Into #Temp Select * From #Temp') 
Exec ('Select 2 as col Into #Temp Select * From #Temp') 

devoluciones

Col 
1 

Col 
2 

No

Col 
1 
2 

O un error porque la tabla ya existe.

La tabla temporal también será accesible mediante cualquier procedimiento 'secundario' que se ejecute también en el procedimiento inicial.

+4

+1 Buen punto, Exec() inicia un ámbito interno. Las tablas temporales creadas dentro de exec() no son visibles para el padre. Las tablas temporales de los padres son visibles para el niño, pero si el niño crea una tabla temporal con el mismo nombre, creará una nueva tabla. – Andomar

+0

¡Probado! ¡Brillante! – Kuyenda

1

También puede considerar el uso de las variables de tabla. Tienen un alcance muy bien definido, y a veces son más rápidos que sus equivalentes temporales de tabla. El único problema con las variables de tabla es que no se pueden indexar, por lo que se podría perder cierto rendimiento a pesar de su naturaleza. Check here para obtener más información sobre el tema.

+0

La gran diferencia entre las variables de tabla y las tablas temporales es que no se puede ALTERAR TABLE una variable de tabla. Sin embargo, puede ALTERAR TABLE una tabla temporal. – Kuyenda

+0

Las variables de tabla son buenas, pero generalmente si no va a almacenar mucha información en ellas. Generalmente intento usar CTE y cuando no puedo, utilizo una tabla temporal con un índice. – DataGirl

Cuestiones relacionadas