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?

Author: Darren, 2013-07-09

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
 70
Author: Jason, 2015-05-01 10:45:45

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 ()

 7
Author: Transact Charlie, 2013-07-09 12:42:59

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.
 1
Author: Curt, 2013-07-09 11:18:30
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.

 0
Author: Darren, 2013-07-09 11:17:31