No SQL Server, qual é a diferença entre uma tabela @, uma tabela # e uma tabela ##?
#table
refere-se a uma tabela temporária local (visível apenas para o usuário que a criou).
##table
refere-se a uma tabela temporária global (visível para todos os usuários).
@variableName
refere-se a uma variável que pode conter valores dependendo do seu tipo.
Felicidades
Dê uma olhada em
#
tabelas #
e ##
são tabelas reais representadas no database temporário. Essas tabelas podem ter índices e statistics, e podem ser acessadas através de sprocs em uma session (no caso de uma tabela temporária global, ela está disponível em todas as sessões).
O @table é uma variável de tabela.
Eu me concentraria nas diferenças entre #table e @table. ## table é uma tabela temporária global e para o registro em mais de 10 anos de uso do SQL Server ainda não encontrei um caso de uso válido. Tenho certeza de que alguns existem, mas a natureza do object torna IMHO altamente inutilizável.
A resposta a @whiner por @marc_s é absolutamente verdadeira: é um mito prevalente que as variables de tabela sempre vivem na memory. Na verdade, é bastante comum que uma variável de tabela vá para o disco e opere como uma tabela temporária.
De qualquer forma, sugiro ler sobre o conjunto de diferenças, seguindo os links apontados pelo @Astander. A maior parte da diferença envolve limitações sobre o que você não pode fazer com variables @table.
CREATE TABLE #t
Cria uma tabela que é visível apenas durante e durante essa CONNECTION o mesmo usuário que cria outra conexão não poderá ver a tabela #t da outra conexão.
CREATE TABLE ##t
Cria uma tabela temporária visível para outras conexões. Mas a tabela é descartada quando a conexão de criação é finalizada.
se você precisar de uma tabela temporária global exclusiva, crie a sua própria com um Prefixo / Sufixo do Uniqueidentifier e solte a execução do post se um object_id (…. O único inconveniente é usar o SQL dynamic e precisar soltar explicitamente.