Eu escrevi um procedimento armazenado que faz uso de uma tabela temporária. Eu sei que no SQL Server, as tabelas temporárias têm escopo de sessão. No entanto, não consegui encontrar informações definitivas sobre exatamente do que uma sessão é capaz. Em particular, se for possível que esse procedimento armazenado seja executado duas vezes simultaneamente em uma única sessão, um nível de isolamento significativamente mais alto será necessário para uma transação nesse procedimento devido às duas execuções que agora compartilham uma tabela temporária.
relate perguntas
-
SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado
-
Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?
-
Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Como determinar se um Índice é necessário ou necessário
Embora a resposta de Brent esteja correta para todos os propósitos práticos, e isso não seja algo que eu já tenha visto alguém se preocupar, é possível que várias invocações de um procedimento armazenado em uma sessão afetem umas às outras por meio de uma tabela #temp com escopo de sessão .
A boa notícia é que é extremamente improvável que aconteça na natureza porque
1) As tabelas #Temp declaradas dentro de procedimentos armazenados ou lotes aninhados não têm visibilidade de sessão (ou tempo de vida). E estes são de longe o caso mais comum.
2) Requer MultipleActiveResultsets e alguma programação de cliente assíncrona muito estranha, ou que o procedimento armazenado retorne um conjunto de resultados no meio e o cliente chame outra instância do procedimento armazenado enquanto processa os resultados do primeiro.
Aqui está um exemplo inventado:
quais saídas
porque a segunda chamada do procedimento armazenado inseriu uma linha e, em seguida, excluiu todas as linhas de #t enquanto a primeira chamada estava aguardando o cliente buscar as linhas de seu primeiro conjunto de resultados. Observe que, se o primeiro conjunto de resultados for pequeno, as linhas podem ser armazenadas em buffer e a execução pode continuar sem enviar nada ao cliente.
Se você mover o
no procedimento armazenado, ele gera:
E com a tabela temporária declarada dentro do procedimento, se você alterar a segunda consulta para
Ele falha com:
Porque uma tabela #temp criada dentro de um procedimento armazenado ou lote aninhado só é visível nesse procedimento armazenado ou lote e em procedimentos aninhados e lotes que ele chama e é destruída quando o procedimento ou lote termina.
Não concomitantemente. Suas opções incluem: