SQL Server 2005 y ámbito de tabla temporal


He leído alrededor del tema de las tablas temporales y el alcance y todas las respuestas que he visto no parecen hablar de una de mis preocupaciones.

Entiendo que el ámbito de una tabla temporal local solo es válido durante la vida útil de un procedimiento almacenado o procedimientos almacenados secundarios. Sin embargo, ¿cuál es la situación con respecto a la concurrencia. es decir, si tengo un procedimiento almacenado que crea una tabla temporal que se llama desde dos procesos diferentes pero desde la misma cadena de usuario / conexión, se que la tabla temporal será compartida entre los dos llama a un procedimiento almacenado o será un caso de cada llamada al procedimiento almacenado crea una tabla temporal instancia.

Asumiría que la tabla temporal pertenece al ámbito de la llamada al procdure almacenado, pero quiero estar seguro antes de ir por un camino con esto.

Author: GEOCHET, 2009-05-21

4 answers

Las tablas temporales locales (comienzan con #) están limitadas a su sesión; otras sesiones, incluso de la misma cadena de usuario/conexión, no pueden verlas. Las reglas para el lifetime dependen de si la tabla temporal local fue creada en un procedimiento almacenado:

  • Una tabla temporal local que se crea en un procedimiento almacenado se elimina cuando el procedimiento termina; otros procedimientos almacenados, o el proceso que llama, no pueden verlos.
  • Otras tablas temporales locales se eliminan cuando el fin de 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 ninguna otra sesión se refiere a ellos

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

select TABLE_NAME from tempdb.information_schema.tables 

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

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

Vea este artículo de MSDN para más información.

 76
Author: Andomar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-21 11:42:56

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

El siguiente script

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

Devuelve

Col
1

Col
2

No

Col
1
2

O un error porque la tabla ya existe.

La tabla temporal también será accesible por cualquier procedimiento 'hijo' que el procedimiento inicial ejecute también.

 11
Author: Martynnw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-21 11:12:04

El siguiente artículo podría ayudar: "Cómo Compartir Datos Entre Procedimientos Almacenados" http://www.sommarskog.se/share_data.html

 3
Author: A-K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-21 12:52:45

También podría pensar en usar variables de tabla. Tienen un alcance muy bien definido, y a veces son más rápidos que sus contrapartes de mesa temporales. El único problema con las variables de tabla es que no se pueden indexar, por lo que se podría perder algo de rendimiento a pesar de su naturaleza. Consulte aquí para obtener más información sobre el tema.

 1
Author: Scott Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-21 13:43:48