Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Criar uma tabela temporária no SQL Server


No SQL Server, as tabelas temporárias são criadas usando o mesmo CREATE TABLE sintaxe como tabelas regulares. A diferença é que os nomes das tabelas temporárias são prefixados com um ou dois sinais numéricos (# ), dependendo se é uma tabela temporária local ou uma tabela temporária global:
  • Tabelas temporárias locais são prefixados com um único sinal numérico (# )
  • Tabelas temporárias globais são prefixados com um sinal de número duplo (## )


Exemplo 1 – Criar uma tabela temporária local


Aqui está um exemplo de criação de uma tabela temporária local:
CREATE TABLE #Cats (
    CatId int PRIMARY KEY,
    CatName varchar(70)
);

O nome que você especifica para uma tabela temporária local pode ter no máximo 116 caracteres. Outros tipos de tabela podem ter 128 caracteres, mas as tabelas temporárias locais são anexadas automaticamente com um sufixo numérico gerado pelo sistema.

Exemplo 2 – Criar uma tabela temporária global


Aqui está um exemplo de criação de uma tabela temporária global:
CREATE TABLE ##Cats (
    CatId int PRIMARY KEY,
    CatName varchar(70)
);

Os nomes de tabelas temporárias globais podem ter no máximo 128 caracteres. O SQL Server não anexa um sufixo numérico gerado pelo sistema a tabelas temporárias globais como faz para tabelas temporárias locais, para que você possa usar todo o espaço.

Exemplo 3 – Visualize as Tabelas Temporárias


Posso executar a seguinte consulta para ver minhas tabelas temporárias recém-criadas.
SELECT name
FROM tempdb.sys.tables
WHERE name LIKE '#Cats%'
OR name = '##Cats';

Resultado:
+----------------------------------------------------------------------------------------------------------------------------------+
| name                                                                                                                             |
|----------------------------------------------------------------------------------------------------------------------------------|
| ##Cats                                                                                                                           |
| #Cats_______________________________________________________________________________________________________________000000000018 |
+----------------------------------------------------------------------------------------------------------------------------------+

Podemos ver que a tabela temporária local teve o sufixo numérico gerado pelo sistema anexado, e é por isso que minha consulta usa o LIKE operador para essa tabela.

Exemplo 4 – Nova sessão


Se eu abrir uma nova sessão, criar uma tabela temporária local com o mesmo nome (Cats) e executar essa consulta novamente, recebo isso:
+----------------------------------------------------------------------------------------------------------------------------------+
| name                                                                                                                             |
|----------------------------------------------------------------------------------------------------------------------------------|
| ##Cats                                                                                                                           |
| #Cats_______________________________________________________________________________________________________________000000000018 |
| #Cats_______________________________________________________________________________________________________________000000000019 |
+----------------------------------------------------------------------------------------------------------------------------------+

Portanto, várias sessões podem criar uma tabela local com o mesmo nome porque o SQL Server modifica esse nome incrementando o sufixo.

Exemplo 5 - Mesma sessão


No entanto, se eu tentar criar a tabela temporária local novamente no mesmo sessão, recebo isso:
Msg 2714, Level 16, State 6, Line 1
There is already an object named '#Cats' in the database.

E se eu abrir mais uma sessão, terei sucesso, e quando eu consultar tempdb.sys.tables Eu entendi isso:
+----------------------------------------------------------------------------------------------------------------------------------+
| name                                                                                                                             |
|----------------------------------------------------------------------------------------------------------------------------------|
| ##Cats                                                                                                                           |
| #Cats_______________________________________________________________________________________________________________000000000018 |
| #Cats_______________________________________________________________________________________________________________000000000019 |
| #Cats_______________________________________________________________________________________________________________00000000001B |
+----------------------------------------------------------------------------------------------------------------------------------+