Aamir Syed

Cuándo utilizar las tablas temporales de SQL frente a las variables de tabla

September 16, 2019 by

Es muy beneficioso el poder almacenar datos en tablas temporales de SQL Server en lugar de manipular o trabajar con las tablas permanentes. Supongamos que desea tener acceso completo a DDL o DML a una tabla, pero no se lo tiene. Puede usar su acceso de lectura existente para poder extraer los datos en una tabla temporal de SQL Server y así realizar ajustes desde allí. O no tiene los permisos para crear una tabla en la base de datos existente, puede tratar de crear una tabla temporal de SQL Server que pueda manipular. Finalmente, es posible que se encuentre en una situación en la que necesite que los datos estén visibles solamente en la sesión actual.

SQL Server puede admitir algunos tipos de tablas temporales de SQL Server que pueden ser muy útiles.

Antes de continuar, si usted desea seguir algunos ejemplos de código, le sugiero abrir SQL Server Management Studio:

Tablas temporales de SQL locales

Las tablas temporales locales de SQL Server se van a crear utilizando el símbolo numeral o “hashtag” seguido del nombre de la tabla. Como, por ejemplo: #Table_name. Las tablas temporales de SQL se crean en la base de datos de la base de datos tempdb. Una tabla temporal local de SQL Server solo es visible para la sesión actual. No puede ser visto y tampoco utilizado por procesos o consultas fuera de la sesión en la que esta se declara.

Aquí mostramos un ejemplo rápido donde se toma un conjunto de resultados y se los coloca en una tabla temporal de SQL Server.

Uno de los escenarios más usados para las tablas temporales de SQL Server está dentro de un ciclo de algún tipo. Como por ejemplo, desea procesar datos para una instrucción SQL y necesita un lugar para almacenar elementos para que su ciclo los pueda leer. Proporciona un medio rápido y eficiente para hacerlo. Vea el ejemplo de código anterior, su ciclo ahora puede hacer referencia a la tabla temporal de SQL Server y procesar los registros que cumplan con los criterios de su objetivo.

Otra razón para tratar de usar las tablas temporales de SQL Server es que debe realizar un procesamiento exigente en su instrucción sql. Supongamos que se crea una unión, y cada vez que necesita extraer registros de ese conjunto de resultados, se debe procesar esta unión nuevamente. ¿Por qué no simplemente procesar este conjunto de resultados una vez y lanzar los registros en una tabla temporal de SQL? Luego, usted puede hacer que el resto de la instrucción sql haga referencia al nombre de la tabla temporal de SQL. Esto no solo nos ahorra el costoso procesamiento de consultas, sino que incluso puede ayudar a hacer que su código se vea un poco más limpio.

Sin embargo, hay un punto que quiero resaltar. Si la sesión en la que estamos trabajando tiene sesiones anidadas posteriormente, las tablas temporales de SQL Server serán visibles en las sesiones inferiores de la jerarquía, pero no arriba en la jerarquía. Permítame visualizar esto.

En este diagrama rápido, se va a crear una tabla temporal de SQL en la sesión 2. Las sesiones siguientes (sesiones 3 y 4) pueden ver la tabla temporal de SQL Server. Pero la sesión 1, que está por encima de la sesión 2, no podrá ver la tabla temporal de SQL Server.

La tabla temporal de SQL se descarta o destruye una vez que la sesión se desconecta. Muchas veces podrá ver que los desarrolladores usan el comando “DROP #Table_Name” al final de su declaración solo para poder limpiar la tabla. Pero depende totalmente de usted y de lo que está tratando de lograr.

También tiene que tener en cuenta que, en caso de conflicto de nombres (recuerde que las tablas temporales de SQL Server se crean en tempdb), el servidor SQL agregará un sufijo al final del nombre de la tabla para que sea único dentro de la base de datos tempdb. Pero este proceso es transparente para el desarrollador/usuario. Puede utilizar el mismo nombre que declaró ya que está limitado a esa sesión.

Tablas temporales globales de SQL

Las tablas temporales globales de SQL son muy útiles cuando desea que el conjunto de resultados sea visible para todas las demás sesiones. No es necesario tratar de configurar los permisos. Cualquiera puede insertar valores, modificar o recuperar registros de la tabla. También tiene que tener en cuenta que cualquiera puede eliminar la tabla. Al igual que las tablas temporales de Local SQL Server, se eliminan una vez que la sesión se desconecta y ya no hay más referencias a la tabla. Siempre puede tratar de usar el comando “DROP” para limpiarlo manualmente. Lo cual es algo que le recomendaría.

Para tratar de crear una tabla temporal global de SQL, simplemente use los dos símbolos de libra delante del nombre de la tabla. Ejemplo: ## Global_Table_Name.

Variables de tabla

Las variables de tabla se crean como cualquier otra variable, utilizando la instrucción DECLARE. Muchos creen que las variables de tabla existen solo en la memoria, pero eso simplemente no es cierto. Ya que residen en la base de datos tempdb de forma muy similar a las tablas temporales de SQL Server locales. También como las tablas temporales de SQL locales, las variables de tabla solo son accesibles dentro de la sesión que las creó. No obstante, a diferencia de las tablas temporales de SQL, solo se puede tratar de acceder a la variable de tabla dentro del lote actual. No son visibles fuera del lote, lo que significa que el concepto de jerarquía de sesión puede ignorarse de alguna manera.

En lo que respecta al rendimiento, las variables de tabla son útiles con pequeñas cantidades de datos (como solo unas pocas filas). De lo contrario, una tabla temporal de SQL Server es útil al examinar grandes cantidades de datos. Ahora, para la mayoría de los scripts, lo más probable es que vea el uso de una tabla temporal de SQL Server en lugar de una variable de tabla. Esto no quiere decir que uno sea más útil que el otro, solo tiene que elegir la herramienta adecuada para el trabajo.

Aquí hay un ejemplo rápido de configuración y uso de una variable de tabla.

Vea que hemos creado una variable de tabla que contendrá información sobre las cantidades totales de un determinado producto vendido. Este es un ejemplo muy simplificado, y no lo usaríamos si contuviera muchas filas. Pero si solo estuviéramos mirando unos pocos productos, esto podría funcionar realmente bien. Una vez que se llena la variable de la tabla, usted puede unirla como una tabla a otra tabla y recopilar la información que necesite. Entonces, hay mucha flexibilidad y permite al desarrollador ser bastante creativo.

Además, en una nota final, en términos de transacciones en variables de tabla. Si un desarrollador revierte una transacción que incluye cambios en las variables de la tabla, los cambios realizados en las variables de la tabla dentro de esta transacción en particular permanecerán intactos. Esto quiere decir, otras partes de esta transacción en cuestión se revertirán, pero cualquier cosa que haga referencia a la variable de la tabla no lo hará, a menos que esa parte de su script tenga un error.


Aamir Syed

Aamir Syed

Aamir es un Administrador de Bases de Datos SQL Server en el área de NYC/NJ (y recientemente ha tomado un rol como un Desarrollador de Bases de Datos).

Él inició su carreta de IT en el mundo de la atención al cliente y eventualmente se movió al lado de administración de redes/sistemas. Después de un tiempo, él desarrolló afección por trabajar con Bases de Datos (principalmente SQL Server) y ha enfocado su carrera en eso por los últimos ocho años. Él ha trabajado para varias industrias en ambientes grandes y pequeños, todos con necesidades diferentes.
SQL Shack le ha provisto con una oportunidad de contribuir a una comunidad que le dio mucho a través de los años.

Ver todas las entradas de Aamir Syed
Aamir Syed
Diseño de bases de datos SQL, Tablas temporales

Acerca de Aamir Syed

Aamir es un Administrador de Bases de Datos SQL Server en el área de NYC/NJ (y recientemente ha tomado un rol como un Desarrollador de Bases de Datos). Él inició su carreta de IT en el mundo de la atención al cliente y eventualmente se movió al lado de administración de redes/sistemas. Después de un tiempo, él desarrolló afección por trabajar con Bases de Datos (principalmente SQL Server) y ha enfocado su carrera en eso por los últimos ocho años. Él ha trabajado para varias industrias en ambientes grandes y pequeños, todos con necesidades diferentes. SQL Shack le ha provisto con una oportunidad de contribuir a una comunidad que le dio mucho a través de los años. Ver todas las entradas de Aamir Syed

387 Views