studio sp3 manager management instalar full descargar completo sql-server sql-server-2005

sql-server - sp3 - sql server 2005 full



Tablas temporales de SQL Server y agrupaciĆ³n de conexiones (8)

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 ramificar a StoredProcB, StoredProcC y StoredProcD para manipular los datos en #temptable según reglas comerciales.

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


Las tablas de temperatura se crean con el cambio de nombre bajo el capó, por lo que no deberían existir conflictos entre las diferentes llamadas a procedimientos almacenados.

Si necesita manipular los mismos datos temporales 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.


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.


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

Una sola tabla temporal # 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.


#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 de SQL Server en los días 6.0 y 6.5 ...



Encuentro la interacción de los temas tablas / sesiones temporales / conexiones / agrupación de conexiones bastante confusas ... :( Mark, su afirmación es una de las más claras que he encontrado al hacer una gran cantidad de investigaciones de Google y MSDN. Sin embargo, me gustaría Conozca la fuente de su declaración.

¿Y alguien puede explicar la diferencia entre la sesión y la conexión conmigo? No pude encontrar hechos concretos sobre eso.

Parece que también hay un problema en la terminología, creo: si "cierra" una conexión, puede que se lance al grupo de conexiones, de modo que la conexión permanezca (durante un tiempo) abierta ... arghs ... ¿Cómo puede usted? diferenciar entre el sabor de cerca y el otro sabor de cerca ?!


De los documentos MS:

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

Tablas temporales

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

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.

Las tablas temporales globales tienen dos signos numéricos (##) como los primeros caracteres de sus nombres; 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 la tabla, cualquier persona que tenga los permisos de seguridad en la base de datos podrá usar la tabla 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, quien corrigió el error de mis formas y solo en caso de que no vea la cita en el comentario:

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

  • Si crea una tabla temporal local dentro de un procedimiento almacenado, la tabla temporal existe solo a efectos del procedimiento almacenado; desaparece cuando sale del procedimiento almacenado.

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