Este artigo oferece cinco opções para verificar se existe uma tabela no SQL Server. A maioria das opções envolve consultar uma visualização do sistema, mas uma das opções executa um procedimento armazenado do sistema e outra envolve uma função.
Eu também incluo alguns simples
IF
declarações que podem ser modificadas para se adequarem às suas circunstâncias. Opção 1 – A visualização sys.tables
Esta opção consulta o
sys.tables
visualização do catálogo do sistema. Esta visualização retorna uma linha para cada tabela de usuário. Portanto, você pode consultá-lo usando o nome da tabela que está verificando. Exemplo:
SELECT object_id FROM sys.tables WHERE name = 'Artists';
Resultado:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Você também pode adicionar o nome do esquema às coisas que está verificando. Veja como modificar a consulta anterior para incluir o nome do esquema:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Resultado:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Observe que o
sys.tables
view só retorna o ID do esquema, então eu tive que passar isso para o SCHEMA_NAME()
função para obter seu nome. Como alternativa, eu poderia ter usado o ID do esquema se soubesse disso. Exemplo:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND schema_id = 1;
Resultado:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Opção 2 – O procedimento armazenado sp_tables
A próxima opção executa o
sp_tables
procedimento armazenado. Veja como seu código pode ser sucinto ao usar este método:
sp_tables 'Artists'
Resultado:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
No entanto, esse procedimento armazenado retorna exibições e tabelas, portanto, é uma boa ideia reduzi-lo a apenas tabelas (a menos que você também esteja interessado em ter exibições retornadas). Para reduzi-lo a apenas tabelas, use
@table_type = "'TABLE'"
. Enquanto você está nisso, você pode especificar o proprietário da mesa e o qualificador da mesa também.
Exemplo:
EXEC sp_tables @table_name = 'Artists', @table_owner = 'dbo', @table_qualifier = 'Music', @table_type = "'TABLE'", @fUsePattern = 1;
Resultado:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
É importante observar que o
@table_type
parâmetro aceita uma lista separada por vírgulas. Portanto, é um pouco diferente dos outros parâmetros. O @table_type
value deve ser colocado entre aspas duplas e cada item entre aspas simples. No meu exemplo, há apenas um item de lista, no entanto, ele ainda precisa ser colocado entre aspas duplas e simples. Opção 3 – INFORMAÇÕES_ESQUEMA.TABELAS
As
INFORMATION_SCHEMA.TABLES
a visualização do sistema retorna uma linha para cada tabela ou visualização no banco de dados atual para a qual o usuário atual tem permissões. É semelhante a sys.tables
, mas retorna menos colunas. As exibições de esquema de informações incluídas no SQL Server estão em conformidade com a definição do padrão ISO para INFORMATION_SCHEMA. Aqui está um exemplo de como usá-lo para verificar se existe uma tabela no banco de dados atual:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists';
Resultado:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Aqui está novamente, mas desta vez eu também especifico o esquema:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists' AND TABLE_SCHEMA = 'dbo';
Resultado:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Opção 4 – A função OBJECT_ID()
Você também pode usar uma função como
OBJECT_ID()
para ver se ele retorna um valor não NULL. Exemplo:
SELECT OBJECT_ID('Artists', 'U') AS Result;
Resultado:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Nesse caso, a tabela existe. Observe que usei
U
para indicar o tipo de objeto (tabela definida pelo usuário). Você também pode fornecer um nome de três partes para incluir o banco de dados e o esquema:
SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
Resultado:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Se a tabela não existir, você receberá
NULL
:SELECT OBJECT_ID('Oops!', 'U') AS Result;
Resultado:
+----------+ | Result | |----------| | NULL | +----------+
Veja abaixo um exemplo de como usar isso em um
IF
demonstração. Opção 5 – A visualização sys.objects
Como se nenhum dos exemplos anteriores fizesse o trabalho, aqui está outra maneira de verificar se existe uma tabela.
Desta vez eu consulto o
sys.objects
visualização do catálogo do sistema. Essa exibição retorna uma linha para cada objeto com escopo de esquema definido pelo usuário no banco de dados. Ele não retorna apenas tabelas, ele retorna todos os tipos de objetos. Portanto, precisamos reduzi-lo a apenas tabelas. Neste caso, estou interessado apenas em tabelas definidas pelo usuário, então posso usar type = 'U'
(U
é para "USER_TABLE"). Como alternativa, você pode usar TYPE_DESC = 'USER_TABLE'
. SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists';
Resultado:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Aqui está novamente, mas especificando o esquema:
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Resultado:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Opção 6 – A visualização sys.sysobjects (EVITE)
Esta opção está listada apenas para que eu possa recomendar não usá-la. Os
sys.sysobjects
O modo de exibição está incluído no SQL Server para compatibilidade com versões anteriores e a Microsoft recomenda que você evite usar esse modo de exibição em trabalhos futuros. Se você encontrar um código que use essa visualização, considere modificá-lo para usar
sys.objects
ou alguma outra visão do sistema ou procedimento armazenado. De qualquer forma, veja como o exemplo anterior pode ficar se estiver usando
sys.sysobjects
em vez de sys.objects
. SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = 'Artists';
Resultado:
+-----------+ | id | |-----------| | 885578193 | +-----------+
Instrução IF 1
Aqui está um simples
IF
instrução que verifica a existência da tabela e, em seguida, imprime uma mensagem diferente dependendo do resultado. Este código pode ser modificado para atender às suas necessidades específicas. IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Resultado:
The table exists
E aqui está o que parece quando a tabela não existe:
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Customer' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Resultado:
The table does not exist
Instrução IF 2
Aqui está outro
IF
declaração que pode ser modificada para atender às suas necessidades específicas. IF OBJECT_ID('Artists', 'U') IS NOT NULL PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Resultado:
The table exists