No SQL Server, qual é a diferença entre uma tabela @, uma tabela # e uma tabela ##?
No SQL Server, qual é a diferença entre uma tabela @, uma tabela # e uma tabela ##?
Respostas:
#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 de seu tipo.
#e as ##tabelas são tabelas reais representadas no banco de dados temporário. Essas tabelas podem ter índices e estatísticas e podem ser acessadas em sprocs em uma sessão (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 informações: 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 registro, em mais de 10 anos de uso do SQL Server, ainda não encontrei um caso de uso válido. Tenho certeza que alguns existem, mas a natureza do objeto o torna IMHO altamente inutilizável.
A resposta a @whiner por @marc_s é absolutamente verdadeira: é um mito prevalente que as variáveis de tabela sempre vivem na memória. 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 por @Astander. A maior parte da diferença envolve limitações sobre o que você não pode fazer com as variáveis @table.
CREATE TABLE #t
Cria uma tabela que só é visível nessa CONEXÃO e durante essa CONEXÃO, 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 criação da conexão é encerrada.
SqlConnection.Open()com a mesma string de conexão é A mesma CONEXÃO ?