Tablas de SQL Server: ¿cuál es la diferencia entre @, # y ##?

En SQL Server, ¿cuál es la diferencia entre una tabla @, una tabla # y una tabla ##?

#table hace referencia a una tabla temporal local (visible solo para el usuario que la creó).

##table refiere a una tabla temporal global (visible para todos los usuarios).

@variableName refiere a una variable que puede contener valores según su tipo.

aclamaciones

Mira esto

  • Tablas temporales vs. Variables de tabla y su efecto en el rendimiento de SQL Server
  • Diferencias entre las tablas temporales de SQL Server y las variables de tabla
  • Tablas temporales y variables de tabla: cuándo usar qué y por qué

# tablas # y ## son tablas reales representadas en la base de datos temporal. Estas tablas pueden tener índices y estadísticas, y se puede acceder a través de sprocs en una sesión (en el caso de una tabla temporal global, está disponible para todas las sesiones).

El @table es una variable de tabla.

Para más información: http://www.sqlteam.com/article/temporary-tables

Me centraría en las diferencias entre #table y @table. ## table es una tabla temporal global y para el registro en más de 10 años de uso de SQL Server todavía tengo que encontrar un caso de uso válido. Estoy seguro de que algunos existen, pero la naturaleza del objeto lo hace altamente inutilizable en mi humilde opinión.

La respuesta a @whiner por @marc_s es absolutamente cierta: es un mito prevaleciente que las variables de tabla siempre viven en la memoria. En realidad, es bastante común que una variable de tabla vaya al disco y funcione como una tabla temporal.

De todos modos, sugiero leer sobre el conjunto de diferencias siguiendo los enlaces señalados por @Astander. La mayor parte de la diferencia implica limitaciones en lo que no se puede hacer con las variables @table.

 CREATE TABLE #t 

Crea una tabla que solo es visible en y durante esa CONEXIÓN el mismo usuario que crea otra conexión no podrá ver la tabla #t desde la otra conexión.

 CREATE TABLE ##t 

Crea una tabla temporal visible para otras conexiones. Pero la tabla se elimina cuando la conexión de creación finaliza.

si necesita una tabla temporal global única, cree la suya propia con un Prefijo / Sufijo Uniqueidentifier y ejecute la publicación posterior si hay un if object_id (…. El único inconveniente es el uso de Dynamic sql y debe descartarse explícitamente.