Estou escrevendo um procedimento armazenado no SQL Server 2008. Preciso verificar se existe uma tabela no banco de dados. Caso contrário, preciso criá-lo.
Como eu faço isso?
sql
sql-server
tsql
sql-server-2008-r2
Prady
fonte
fonte
CREATE TABLE IF NOT EXISTS ...
Respostas:
Algo assim
fonte
if (not exists (select object_id from sys.objects where object_id = OBJECT_ID(N'[dbo].[client_tgi_g67_period_list]') and type = 'U'))
Apenas por contraste, eu gosto de usar a função object_id, como mostrado abaixo. É um pouco mais fácil de ler, e você não precisa se preocupar com sys.objects x sysobjects x sys.all_objects x sys.tables. Forma básica:
Obviamente, isso será exibido como "Presente" se houver algum objeto com esse nome. Se você quiser verificar apenas as tabelas, precisará:
Também funciona para tabelas temporárias:
fonte
Vamos criar um banco de dados de exemplo com uma tabela pelo script abaixo:
Abordagem 1: Usando a visualização INFORMATION_SCHEMA.TABLES
Podemos escrever uma consulta como abaixo para verificar se existe uma tabela tblTest no banco de dados atual.
A consulta acima verifica a existência da tabela tblTest em todos os esquemas no banco de dados atual. Em vez disso, se você quiser verificar a existência da tabela em um esquema especificado e no banco de dados especificado, podemos escrever a consulta acima, como abaixo:
Prós desta abordagem: as visualizações INFORMATION_SCHEMA são portáveis em diferentes sistemas RDBMS, portanto, a migração para diferentes RDBMS não requer nenhuma alteração.
Abordagem 2: Usando a função OBJECT_ID ()
Podemos usar a
OBJECT_ID()
função como abaixo para verificar se existe uma tabela tblTest no banco de dados atual.A especificação das partes Nome do banco de dados e Nome do esquema para o Nome da tabela é opcional. Mas especificar Nome do banco de dados e Nome do esquema fornece uma opção para verificar a existência da tabela no banco de dados especificado e dentro de um esquema especificado, em vez de verificar o banco de dados atual em todos os esquemas. A consulta abaixo mostra que, embora o banco de dados atual seja o banco de dados MASTER, podemos verificar a existência da
tblTest
tabela nodbo
esquema noTest
banco de dados.Prós: Fácil de lembrar. Um outro ponto notável a ser mencionado sobre a
OBJECT_ID()
função é: fornece uma opção para verificar a existência da tabela temporária criada no contexto de conexão atual. Todas as outras abordagens verificam a existência da tabela temporária criada em todo o contexto das conexões, em vez de apenas no contexto atual da conexão. A consulta abaixo mostra como verificar a existência de uma tabela temporária usando aOBJECT_ID()
função:Abordagem 3: Usando sys.Objects Catalog View
Podemos usar a
Sys.Objects
visualização de catálogo para verificar a existência da tabela, como mostrado abaixo:Abordagem 4: usando o sys.Tables Catalog View
Podemos usar a
Sys.Tables
visualização de catálogo para verificar a existência da tabela, como mostrado abaixo:Sys.Tables
A exibição de catálogo herda as linhas daSys.Objects
exibição de catálogo; a exibição deSys.objects
catálogo é chamada de exibição base, ondesys.Tables
é chamada de exibição derivada.Sys.Tables
retornará as linhas apenas para os objetos de tabela, enquanto aSys.Object
exibição, além de retornar as linhas para os objetos de tabela, retorna linhas para os objetos como: procedimento armazenado, visualizações etc.Abordagem 5: Evite usar a tabela do sistema sys.sysobjects
Devemos evitar o uso
sys.sysobjects
direto da tabela do sistema, pois o acesso direto a ela será preterido em algumas versões futuras do Sql Server. Conforme o link [Microsoft BOL] [1], a Microsoft está sugerindo o uso das visualizações de catálogo emsys.objects/sys.tables
vez dasys.sysobjects
tabela do sistema diretamente.Referência: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
fonte
EDITADO
Você pode procurar em sys.tables para verificar a tabela de existência desejada:
fonte
fonte
fonte
Tente a seguinte instrução para verificar a existência de uma tabela no banco de dados:
Você pode criar a tabela dentro do bloco if.
fonte
sysobjects
é uma visão de compatibilidade que existe apenas para evitar a quebra de código antigo. Minha sugestão seria usar modos de exibição de catálogo do sistema (por exemplosys.objects
,sys.tables
) para código que apenas segmentará instâncias do SQL Server 2008 e modos de exibição de esquema de informações (por exemploinformation_schema.tables
) para código que precisa ser portátil. Você pode encontrar mais informações sobre os diferentes pontos de vista aqui: Consultando o Catálogo SQL Server SystemSe não estou errado, isso deve funcionar:
fonte