Tabelas do SQL Server: qual é a diferença entre @, # e ##?

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 temporárias versus variables ​​de tabela e seu efeito no desempenho do SQL Server
  • Diferenças entre tabelas temporárias do SQL Server e variables ​​de tabela
  • Tabelas temporárias e variables ​​de tabela: quando usar o que e por que

# 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.

Para mais: http://www.sqlteam.com/article/temporary-tables

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.