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

6 maneiras de verificar se existe uma tabela no SQL Server (Exemplos de T-SQL)


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