En SQL Server, ¿cuál es la diferencia entre una tabla @, una tabla # y una tabla ##?
En SQL Server, ¿cuál es la diferencia entre una tabla @, una tabla # y una tabla ##?
Respuestas:
#table
se refiere a una tabla temporal local (visible solo para el usuario que la creó).
##table
se refiere a una tabla temporal global (visible para todos los usuarios).
@variableName
se refiere a una variable que puede contener valores dependiendo de su tipo.
#
y las ##
tablas son tablas reales representadas en la base de datos temporal. Estas tablas pueden tener índices y estadísticas, y se puede acceder a ellas a través de sprocs en una sesión (en el caso de una tabla temporal global, está disponible en todas las sesiones).
@Table es una variable de tabla.
Me centraría en las diferencias entre #table y @table. ## table es una tabla temporal global y, para que conste en más de 10 años de uso de SQL Server, todavía no he encontrado un caso de uso válido. Estoy seguro de que existen algunos, 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 la 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 sobre lo que no 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 de la otra conexión.
CREATE TABLE ##t
Crea una tabla temporal visible para otras conexiones. Pero la tabla se descarta cuando finaliza la conexión de creación.
SqlConnection.Open()
con la misma cadena de conexión es la misma CONEXIÓN ?