Duas sessões podem criar #temp tables com o mesmo nome?

16

Estou criando uma tabela temporária ( #myTable) e usando um cursor. Isso cria um problema quando usuários simultâneos estão acessando o cursor através do meu aplicativo? Isso me permite criar tabelas temporárias separadas com o mesmo nome?

A seguir está o código de exemplo:

Open cursor;
Fetch Next from cursor into @Variable_Temp_Table_Name;
Create table #myTable(pk int)
While @@Fetch_Status = 0
Begin    
Fetch Next from cursor into @Variable_Temp_Table_Name;
End 
sujith karivelil
fonte

Respostas:

20

O servidor SQL sempre acrescenta algum número aleatório no final de um nome de tabela temporária (nos bastidores), quando os usuários simultâneos criam tabelas temporárias em suas sessões com o mesmo nome, o sql server criará várias tabelas temporárias no tempdb.

Criei 3 tabelas temporárias chamadas #TempTableem três sessões diferentes no meu SSMS. Agora, se for para o tempdb, posso ver as tabelas temporárias criadas lá com uma sequência aleatória (exclusiva) anexada ao nome de cada tabela temporária.

insira a descrição da imagem aqui

M.Ali
fonte
11

Sim, vários aplicativos obterão suas próprias cópias da tabela #temp. Esse é o ponto de usar uma tabela #temp, porque cada sessão simultânea possui seu próprio objeto isolado. Isso não tem nada a ver com o uso de um cursor em combinação com sua tabela #temp (embora eu suspeite que o cursor não seja necessário de qualquer maneira - você não incluiu código suficiente para comentar especificamente).

Edite para incluir o comentário:

Uma coisa adicional sobre o uso de tabelas #temp é que, se você precisar adicionar restrições a elas, permita que o servidor SQL gere o nome, mesmo que a tabela seja exclusiva da sessão, a restrição não ocorrerá e a segunda instância terá um erro ao criar o mesa.

Aaron Bertrand
fonte
7
Uma coisa adicional sobre o uso de tabelas #temp é que, se você precisar adicionar restrições, permita que o servidor SQL gere o nome, mesmo que a tabela seja exclusiva da sessão, a restrição não ocorrerá e a segunda instância terá um erro ao criar o mesa.
Aaron
1
@ Aaron - Sugira que você mova o comentário sobre restrições sem nome para a resposta. Muitas pessoas estragam esse detalhe.
RLF 26/09
Observe também que, se alguém faz querer uma tabela temporária global, que pode declará-lo ##likeThis.
underscore_d
@RLF e Aaron: sempre é possível gerar um GUID com NEWID () e criar a restrição via Dynamic SQL. Não dizer que é tão limpo quanto incluí-lo na instrução CREATE TABLE, mas é pelo menos uma opção. E também acredito que restrições FK não são permitidas em tabelas temporárias (desde que falemos genericamente de restrições).
Solomon Rutzky 26/09
@srutzky - Verdadeiro, mas as restrições nomeadas geralmente são nomeadas para facilitar a referência a partir do código. O uso de um NEWID () não fornecerá essa simplificação, embora você possa consultar para encontrar o NEWID, se necessário.
RLF 28/09