En SQL Server, las tablas temporales se crean usando el mismo CREATE TABLE
sintaxis como tablas normales. La diferencia es que los nombres de las tablas temporales tienen como prefijo uno o dos signos numéricos (#
), dependiendo de si se trata de una tabla temporal local o una tabla temporal global:
- Tablas temporales locales tienen el prefijo de un solo signo de número (
#
) - Tablas temporales globales tienen el prefijo de un signo de número doble (
##
)
Ejemplo 1:crear una tabla temporal local
Este es un ejemplo de creación de una tabla temporal local:
CREATE TABLE #Cats ( CatId int PRIMARY KEY, CatName varchar(70) );
El nombre que especifique para una tabla temporal local puede tener un máximo de 116 caracteres. Otros tipos de tablas pueden tener 128 caracteres, pero las tablas temporales locales se agregan automáticamente con un sufijo numérico generado por el sistema.
Ejemplo 2:crear una tabla temporal global
Este es un ejemplo de creación de una tabla temporal global:
CREATE TABLE ##Cats ( CatId int PRIMARY KEY, CatName varchar(70) );
Los nombres de tablas temporales globales pueden tener un máximo de 128 caracteres. SQL Server no agrega un sufijo numérico generado por el sistema a las tablas temporales globales como lo hace con las tablas temporales locales, por lo que puede utilizar todo el espacio.
Ejemplo 3:ver las tablas temporales
Puedo ejecutar la siguiente consulta para ver mis tablas temporales recién creadas.
SELECT name FROM tempdb.sys.tables WHERE name LIKE '#Cats%' OR name = '##Cats';
Resultado:
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | +----------------------------------------------------------------------------------------------------------------------------------+
Podemos ver que a la tabla temporal local se le ha agregado el sufijo numérico generado por el sistema, y es por eso que mi consulta usa LIKE
operador para esa tabla.
Ejemplo 4:nueva sesión
Si abro una nueva sesión, creo una tabla temporal local con el mismo nombre (Cats), luego ejecuto esta consulta nuevamente, obtengo esto:
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | | #Cats_______________________________________________________________________________________________________________000000000019 | +----------------------------------------------------------------------------------------------------------------------------------+
Por lo tanto, varias sesiones pueden crear una tabla local con el mismo nombre porque SQL Server modifica ese nombre incrementando el sufijo.
Ejemplo 5:misma sesión
Sin embargo, si trato de crear la tabla temporal local nuevamente en el mismo sesión, obtengo esto:
Msg 2714, Level 16, State 6, Line 1 There is already an object named '#Cats' in the database.
Y si abro otra sesión, tengo éxito, y cuando consulto tempdb.sys.tables
Me sale esto:
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | | #Cats_______________________________________________________________________________________________________________000000000019 | | #Cats_______________________________________________________________________________________________________________00000000001B | +----------------------------------------------------------------------------------------------------------------------------------+