Porque é que o ID do objecto foi usado ao verificar se existe ou não uma tabela
Preciso de verificar se existe ou não uma tabela em sql.
Caso contrário, deve criar um automaticamente. Agora pesquisei e encontrei esta codificação:IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[YourTable](
....
....
....
)
END
Alguém pode explicar porque diz onde e o que devo colocar no seu lugar?
4 answers
Gosto desta sintaxe:
if(object_id(N'[dbo].[YourTable]', 'U') is not null)
...
Em que o object_id toma o tipo de objecto de 2 caracteres como segundo parâmetro. Você pode encontrar a lista de tipos de objetos listados abaixo no sistema .documentação dos objectos:
- AF = função agregada (CLR)
- C = restrição de verificação
- D = predefinição (restrição ou stand-alone)
- F = restrição de chave estrangeira
- FN = função escalar SQL
- FS = função escalar da montagem (CLR)
- FT = montagem (CLR) função do valor do quadro
- IF = SQL inline table-valued function
- IT = Quadro Interno
- P = SQL procedimento armazenado
- PC = Conjunto (CLR) armazenado-procedimento
- PG = Guia do Plano
- PK = restrição de chave primária
- R = Regra (estilo antigo, independente)
- RF = replicação-filtro-procedimento
- s = Tabela de base do Sistema
- SN = sinónimo
- SO = Sequence object
- SQ = Fila de Serviços
- TA = Assembleia (CLR) Triglicer DML
- TF = SQL table-valued-function
- TR = SQL DML trigger
- TT = tipo de Tabela
- U = tabela (definida pelo utilizador)
- UQ = restrição única
- V = Ver
- X = procedimento armazenado alargado
A forma ISO SQL de verificar a existência de um objecto de nível de tabela é o INFORMATION_SCHEMA.TABLES view
Não há nada de errado em olhar para o sys.objectos, mas.... INFORMATION_SCHEMA.As tabelas são um pouco mais declarativas -- e são plataformas cruzadas (o que muitas vezes não importa, mas meh ainda é legal.) Acho que isto é provavelmente mais legível para um novo programador.DECLARE @tableName SYSNAME = 'tbfoo'
DECLARE @schemaNAme SYSNAME = 'fooSchema'
IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tableName AND TABLE_SCHEMA = @schemaName )
BEGIN
RAISERROR('%s exists in schema: %s', 0, 1, @tableName, @schemaName)
END
ELSE
BEGIN
RAISERROR('%s DOES NOT EXIST in schema: %s', 0, 1, @tableName, @schemaName)
END
Não te preocupes com o comando RAISERROR. é uma boa forma de imprimir. mensagens formatadas.
Você pode consultar a vista INFORMATION_SCHEMA para ter uma noção do que está nela.
SELECT TOP 5 * FROM INFORMATION_SCHEMA.TABLES
Como pode ver -- pode referenciar esquemas e catálogos pelo nome em vez de procurar o seu ID com o OBJECT_ID ()
OBJECT_ID()
é uma função que devolve o ID do objecto. Ver a documentação:
Devolve o número de identificação do objecto da base de dados de um esquema-scoped objecto.
Http://msdn.microsoft.com/en-us/library/ms190328.aspx
Passando-lhe certos parâmetros (ie. os detalhes da sua mesa), ele vai devolver uma identificação. Poderá então comparar isto com os IDs da tabela
sys.objects
para verificar se existe de momento.
object_id = OBJECT_ID(N'[dbo].[YourTable]')
object_id
é o nome da coluna em sys.objects
OBJECT_ID
é uma função que devolve o ID
para o objecto que indicar, ou seja YourTable
.
Está a comparar o objectivo de YourTable
com a coluna object_id
na tabela sys.objects
. Você precisa substituir YourTable
pelo nome da tabela que deseja verificar já existe.