2008-09-26 18 views
26

Tengo una aplicación ASP.NET multiusuario que se ejecuta en SQL Server y quiero que StoredProcA cree una tabla temporal #temptable, no una variable de tabla, para insertar algunos datos, luego bifurque a StoredProcB , StoredProcC y StoredProcD para manipular los datos en #temptable por reglas de negocio.SQL Server Temp Tables y Connection Pooling

La aplicación web utiliza la agrupación de conexiones al hablar con SQL. ¿Obtendré un nuevo área de scratch #temptable para cada llamada de StoredProcA? ¿O compartirá la conexión la #temptable entre los usuarios?

Respuesta

37

La agrupación de conexiones (con cualquier versión moderna de SQL Server) llamará al sp_reset_connection al reutilizar una conexión. Este proceso almacenado, entre otras cosas, drops any temporary tables que posee la conexión.

+0

Bien, ahora esta afirmación tiene sentido para mí: "Cuando la tabla va precedida por un único signo '#', se define como una tabla temporal local y su alcance está limitado a la sesión en la que se creó". ¡La palabra "sesión" me dejó perplejo! – marc

+0

¿Qué hay de las tablas temporales globalmente visibles (## tableName)? –

+0

Las tablas temporales globales no tienen acceso a una conexión, por lo que no se descartarán. –

1

Para compartir una tabla temporal entre los usuarios, use dos valores hash antes del nombre ## like_this.

En este caso, asegúrese de tomar medidas para evitar conflictos con varias instancias del programa.

6

Todos los usuarios comparten una tabla ##. Supongo que esta no es tu intención.

Una sola tabla de temperatura es visible para todos los procedimientos almacenados en la pila de llamadas, pero no es visible fuera de ese alcance. Si puede hacer que el Proc A llame a B, C y D, debería estar bien.

Editar: El procedimiento de informe en el que debería estar trabajando ahora es muy parecido. :) Creo una tabla temporal (#resultados) en el proceso de raíz invocado por la aplicación, luego realizo algunos cambios complicados en una serie de procedimientos secundarios, para 1) extraer código repetido, y 2) mantener el procedimiento raíz sin ejecutar a más de 500 líneas.

+0

Sí, eso es exactamente. ¡Gracias! – marc

+0

Great S.O. pregunta por cierto; una pregunta que todos hacen en algún momento.Apuesto a que esta será una de esas preguntas que impulsa el tráfico de Google aquí, y que algún día será al menos plateada. –

2

#temptable no sobrevive más allá del final del procedimiento en el que se declaró, por lo que nunca será visto por otros usuarios.

Editar: Heh, resulta que la "visibilidad de anidamiento" de las tablas temporales ha funcionado desde SQL Server 7.0, pero nunca actualicé ninguno de mis códigos para aprovechar esto. Supongo que estoy saliendo conmigo mismo - muchas personas probablemente no pueden imaginarse el infierno que fue SQL Server en los días 6.0 y 6.5 ...

+1

#temptable tiene alcance de conexión, no alcance del procedimiento. –

+1

Me temo que estás equivocado. –

+0

Y aquí hay una cita para eso: http://decipherinfosys.wordpress.com/2007/05/04/temporary-tables-ms-sql-server/ –

0

Las tablas de temperatura se crean con el nombre que se forma bajo el capó por lo que no debería No se trata de conflictos entre diferentes llamadas a procedimientos almacenados.

Si necesita manipular los mismos datos de temperatura en las siguientes llamadas a procedimientos almacenados, lo mejor es ir con una tabla real y usar algún tipo de identificador único para asegurarse de que solo está tratando con datos relevantes. Si los datos solo son valiosos temporalmente, elimínelos manualmente una vez que haya terminado.

2

A partir de los documentos de MS:

http://msdn.microsoft.com/en-us/library/ms177399(SQL.90).aspx

tablas temporales

Las tablas temporales son similares a las tablas permanentes, excepto las tablas temporales se almacenan en tempdb y se eliminan automáticamente cuando ya no se usan

Hay dos tipos de tablas temporales: locales y globales. Se diferencian entre sí en sus nombres, su visibilidad y su disponibilidad.Las tablas temporales locales tienen un solo signo de número (#) como primer carácter de sus nombres; solo son visibles para la conexión actual del usuario y se borran cuando el usuario se desconecta de la instancia de SQL Server.

tablas temporales globales tienen dos signos de número (##) como los primeros caracteres de su nombre; son visibles para cualquier usuario 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.

Por ejemplo, si crea los empleados de mesa, la mesa puede ser utilizado por cualquier persona que tiene los permisos de seguridad en la base de datos para utilizarlo, hasta que se elimine la tabla. Si una sesión de base de datos crea los #employees de tablas temporales locales, solo la sesión puede funcionar con la tabla y se elimina cuando la sesión se desconecta. Si crea los empleados de la tabla temporal global ##, cualquier usuario de la base de datos puede trabajar con esta tabla. Si ningún otro usuario trabaja con esta tabla después de crearla, la tabla se elimina cuando se desconecta. Si otro usuario trabaja con la tabla después de crearla, SQL Server la elimina después de desconectarse y después de que todas las otras sesiones ya no la estén usando activamente.

Además de Curt que corrige el error de mis caminos, y en caso de que se pierda la cita en el comentario:

http://msdn.microsoft.com/en-us/library/ms191132.aspx

  • si se crea un local de tabla temporal dentro de una procedimiento almacenado, la tabla temporal existe solo para el propósito del procedimiento almacenado; desaparece al salir del procedimiento almacenado .

  • Si ejecuta un procedimiento almacenado que llama a otro procedimiento almacenado, el llamado procedimiento almacenado puede acceder a todos los objetos creados por el primer procedimiento almacenado, incluyendo tablas temporales.

+1

Dijo específicamente que está usando procedimientos almacenados. Lo que diga es cierto si la tabla temporal está en el "nivel superior" de la conexión, pero cuando se utiliza dentro de un procedimiento almacenado, se elimina automáticamente al final. Buscaré una cita en los documentos oficiales. –

+1

"Si crea una tabla temporal local dentro de un procedimiento almacenado, la tabla temporal existe solo para los propósitos del procedimiento almacenado, desaparece cuando sale del procedimiento almacenado". @ http://msdn.microsoft.com/en-us/library/ms191132.aspx –

+0

Hola Curt: punto tomado y entendido y disculpas :) – Kev

1

me resulta de la interacción de los sujetos tablas temporales/sesiones/conexiones/agrupación de conexiones muy confuso ... :( Marcos, su estado es uno de los más claros que he encontrado haciendo un montón de Google y la investigación de MSDN. Aún así, me gustaría saber el origen de su estado de cuenta.

y por favor alguien puede explicar la diferencia entre sesión y conexión conmigo? no pude encontrar ningún hechos concretos al respecto.

parece también es un problema de terminología, creo: si "cierras" una conexión Por lo tanto, es posible que se libere al grupo de conexiones, por lo que la conexión permanece (por un tiempo) abierta ... arghs ... ¿Cómo se puede diferenciar entre un sabor de cerca y otro de cerca?

Cuestiones relacionadas