Tabelas do servidor SQL: Qual é a diferença entre @, # e#?
no servidor SQL, Qual é a diferença entre uma tabela@, uma tabela # e uma tabela##?
6 answers
#table
refere-se a uma tabela temporária local (visível apenas para o utilizador 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 as tabelas reais representadas na base de dados temp. Estas tabelas podem ter índices e estatísticas, e podem ser acessadas através de sprocs em uma sessão (no caso de uma tabela global temp, está disponível em todas as sessões).
A tabela @é uma variável de tabela.
Eu concentrar-me-ia nas diferenças entre a tabela #e a tabela@. ## table is a global temporary table and for the record in over 10 years of using SQL Server I have yet to meet a valid use case. Tenho a certeza que alguns existem, mas a natureza do objecto torna-o altamente inutilizável IMHO.
A resposta a @whiner por @marc_s é absolutamente verdadeira: é um mito prevalente que as variáveis da tabela sempre vivem na memória. É realmente bastante comum para uma variável da tabela ir ao disco e operar como uma mesa temporária.
Seja como for, sugiro que se Leia o conjunto de diferenças seguindo os links apontados por @Astander. A maior parte da diferença envolve limitações no que você não pode fazer com as variáveis @table.
CREATE TABLE #t
Cria uma tabela que só é visível nessa ligação e durante essa ligação o mesmo usuário que cria outra conexão não será capaz de ver a tabela #t da outra conexão.
CREATE TABLE ##t
Cria uma tabela temporária visível para outras ligações. Mas a tabela é deixada cair quando a conexão de criação é terminada.
Se precisar de uma tabela temporária global única, crie a sua própria com um prefixo / sufixo Uniqueidentifier e largue a execução Pós-se for um object_id if(.... A única desvantagem é usar SQL dinâmico e precisa cair explicitamente.