Uma tabela temporária no SQL Server, como o nome sugere, é uma tabela de banco de dados que existe temporariamente no servidor de banco de dados. Uma tabela temporária armazena um subconjunto de dados de uma tabela normal por um determinado período de tempo.
As tabelas temporárias são particularmente úteis quando você tem um grande número de registros em uma tabela e precisa interagir repetidamente com um pequeno subconjunto desses registros. Nesses casos, em vez de filtrar os dados repetidamente para buscar o subconjunto, você pode filtrar os dados uma vez e armazená-los em uma tabela temporária. Você pode então executar suas consultas nessa tabela temporária. As tabelas temporárias são armazenadas dentro do “tempdb”, que é um banco de dados do sistema. Vamos dar uma olhada em como você pode usar dados temporários em um cenário simples.
Preparando os dados
Vamos primeiro preparar alguns dados fictícios. Usaremos esses dados para criar tabelas temporárias.
Execute o script a seguir em seu servidor de banco de dados.
CREATE DATABASE schooldb CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, gender VARCHAR(50) NOT NULL, age INT NOT NULL, total_score INT NOT NULL, ) INSERT INTO student VALUES (1, 'Jolly', 'Female', 20, 500), (2, 'Jon', 'Male', 22, 545), (3, 'Sara', 'Female', 25, 600), (4, 'Laura', 'Female', 18, 400), (5, 'Alan', 'Male', 20, 500), (6, 'Kate', 'Female', 22, 500), (7, 'Joseph', 'Male', 18, 643), (8, 'Mice', 'Male', 23, 543), (9, 'Wise', 'Male', 21, 499), (10, 'Elis', 'Female', 27, 400);
O script SQL acima cria um banco de dados ‘schooldb’. Nesse banco de dados, uma tabela chamada 'aluno' é criada e alguns dados fictícios são adicionados à tabela.
Criando uma tabela temporária
Existem dois métodos de criação de tabelas temporárias.
Método 1
A maneira mais simples de criar uma tabela temporária é usando uma instrução INTO em uma consulta SELECT. Vamos criar uma tabela temporária que contém o nome, idade e sexo de todos os registros de alunos do sexo masculino da tabela de alunos.
USE schooldb; SELECT name, age, gender INTO #MaleStudents FROM student WHERE gender = 'Male'
Dê uma olhada na consulta acima. Aqui criamos uma tabela temporária “#MaleStudents” que armazena o nome, idade e sexo de todos os registros de alunos do sexo masculino da tabela de alunos. Para definir uma tabela temporária, usamos a instrução INTO após a instrução SELECT. O nome de uma tabela temporária deve começar com um hash (#).
Agora, para ver onde esta tabela existe; vá para “Explorador de Objetos -> Bancos de Dados -> Bancos de Dados do Sistema-> tempdb -> Tabelas Temporárias”. Você verá o nome da sua tabela temporária junto com o identificador. Dê uma olhada na figura a seguir:
Você deve estar se perguntando sobre o “000000000006” no final do nome da tabela. Este é um identificador único. Várias conexões de banco de dados podem criar tabelas temporárias com o mesmo nome, portanto, para diferenciar as tabelas temporárias criadas por conexões diferentes, o servidor de banco de dados anexa automaticamente esse identificador exclusivo no final.
Você pode realizar operações na tabela temporária por meio da mesma conexão que a criou. Portanto, na mesma janela de consulta que criou a tabela “#MaleStudents”, execute a seguinte consulta.
SELECT * FROM #MaleStudents
Desde então, a tabela #MaleStudents contém o nome, idade e sexo de todos os alunos do sexo masculino. A consulta acima buscará os seguintes resultados.
[ID da tabela=15 /]
Para criar uma nova conexão, basta abrir uma nova janela de consulta no “SQL Server Management Studio”. Agora, mantenha a conexão anterior aberta e crie outra tabela “MaleStudents” usando o método 2 em uma nova janela de consulta (nova conexão).
Método 2
O segundo método é semelhante à criação de tabelas normais. Dê uma olhada na consulta a seguir. Aqui, novamente, vamos criar a tabela temporária #MaleStudents. Lembre-se, esta consulta deve ser executada por uma nova conexão.
USE schooldb; CREATE TABLE #MaleStudents ( name VARCHAR(50), age int, gender VARCHAR (50) ) INSERT INTO #MaleStudents SELECT name, age, gender FROM student WHERE gender = 'Male'
Agora, se você executar a consulta acima, deverá ver duas tabelas temporárias #MaleStudents com diferentes identificadores exclusivos dentro do tempdb. Isso ocorre porque essas duas tabelas foram criadas por duas conexões diferentes. Dê uma olhada na captura de tela a seguir.
Tabelas temporárias globais
É pertinente mencionar aqui que, uma tabela temporária só é acessível à conexão que criou essa tabela temporária. Não é acessível a outras conexões. No entanto, podemos criar tabelas temporárias acessíveis a todas as conexões abertas. Essas tabelas temporárias são chamadas de tabelas temporárias globais. O nome da tabela temporária global começa com um símbolo de hash duplo (##). Vamos criar uma tabela temporária global que contém registros de todas as alunas da tabela de alunos.
USE schooldb; SELECT name, age, gender INTO ##FemaleStudents FROM student WHERE gender = 'Female'
Agora, você pode acessar a tabela ##FemaleStudents de qualquer uma das conexões abertas.
Excluindo uma tabela temporária
Há duas maneiras de excluir tabelas temporárias no SQL Server:exclusão automática e exclusão manual.
Exclusão automática
Uma tabela temporária é excluída automaticamente quando a conexão que criou a tabela é fechada. Alternativamente, ao fechar a janela de consulta que criou a tabela temporária, sem salvar as alterações, a tabela será fechada. Se uma conexão estiver executando algumas consultas na tabela global, essas consultas devem ser concluídas primeiro antes que a tabela global seja excluída.
Exclusão manual da tabela
Você pode excluir manualmente uma tabela sem fechar uma conexão usando a instrução DROP TABLE. No entanto, lembre-se de que a instrução deve ser executada pela conexão que realmente criou a tabela. Dê uma olhada na seguinte consulta:
DROP TABLE #MaleStudents
Isso é semelhante à exclusão de uma tabela normal.
Tabelas temporárias e procedimentos armazenados
Anteriormente, aprendemos que uma tabela temporária só pode ser acessada localmente dentro da conexão que a criou. Há uma exceção a essa regra. Ao criar procedimentos armazenados, você também pode acessar tabelas temporárias em outras conexões.
Vamos criar dois procedimentos armazenados usando duas conexões diferentes. O primeiro procedimento armazenado inserirá dados na tabela #MaleStudents, enquanto o segundo selecionará os dados da tabela.
Crie uma nova conexão. Se você estiver usando o SQL Server Management Studio, poderá fazê-lo abrindo uma nova janela de consulta. Execute o seguinte script SQL na nova janela de consulta.
Create Procedure spInsertStudent (@Name Varchar(50), @Age int, @Gender Varchar(50)) As Begin Insert Into #MaleStudents Values (@Name, @Age, @Gender) End
Agora criamos um procedimento armazenado que insere um registro na tabela temporária #MaleStudent. Observe que essa conexão não criou o #MaleStudent, mas estamos acessando-o inserindo um registro nele. Isso ocorre porque ao criar um procedimento armazenado você pode acessar tabelas temporárias de uma conexão diferente daquela que criou a tabela. Se você executar a consulta acima, verá que o SQL Server não lançará nenhum erro.
Da mesma forma, abra uma nova conexão e crie o seguinte procedimento armazenado nela:
CREATE PROCEDURE spListStudent AS BEGIN SELECT * FROM #MaleStudents ORDER BY name END
O procedimento armazenado acima seleciona todos os registros da tabela temporária #MaleStudents. Aqui novamente, estamos acessando uma tabela temporária dentro de uma conexão que não criou a tabela.
Agora aqui está a parte complicada. Embora você possa acessar uma tabela temporária dentro de outra conexão ao criar um procedimento armazenado, você não pode acessar uma tabela temporária ao “executar” um procedimento armazenado dentro de outra conexão. Para executar um procedimento armazenado que acessa uma tabela temporária, você precisa estar dentro da conexão que criou a tabela temporária.
Portanto, execute as seguintes consultas dentro da conexão que criou a tabela #MaleStudents.
EXECUTE spInsertStudent Bradley, 45, Male Execute spListStudent
Aqui, o primeiro procedimento armazenado insere um novo registro de aluno com o nome:Bradley, idade:45 e sexo:Masculino na tabela #MaleStudents. O segundo procedimento armazenado seleciona todos os registros da tabela #MaleStudents em ordem crescente de nome. A saída dos procedimentos armazenados acima será:
[ID da tabela=16 /]
Você pode ver claramente nosso registro recém-inserido nos registros selecionados acima.
Veja também:
Desempenho de variáveis de tabela no SQL Server
Apresentando expressões de tabela comuns no SQL Server