检查表是否存在时为何使用OBJECT_ID

时间:2013-07-09 11:15:13

标签: sql sql-server database

我需要检查sql中是否存在表。

如果不是,则必须自动创建一个。

现在我研究并发现了这个编码:

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

任何人都可以解释为什么它会说object_id = OBJECT_ID以及我应该把它放在哪里?

4 个答案:

答案 0 :(得分:77)

我喜欢这种语法:

if(object_id(N'[dbo].[YourTable]', 'U') is not null)
...

其中object_id将2 char类型的对象作为第二个参数。您可以在sys.objects documentation

中找到下面列出的对象类型列表
  • AF =聚合函数(CLR)
  • C = CHECK约束
  • D = DEFAULT(约束或独立)
  • F = FOREIGN KEY约束
  • FN = SQL标量函数
  • FS =汇编(CLR)标量函数
  • FT =汇编(CLR)表值函数
  • IF = SQL内联表值函数
  • IT =内部表格
  • P = SQL存储过程
  • PC =汇编(CLR)存储过程
  • PG =计划指南
  • PK = PRIMARY KEY约束
  • R =规则(旧式,独立)
  • RF =复制过滤程序
  • S =系统基表
  • SN =同义词
  • SO =序列对象
  • SQ =服务队列
  • TA =汇编(CLR)DML触发器
  • TF = SQL table-valued-function
  • TR = SQL DML触发器
  • TT =表格类型
  • U =表格(用户定义)
  • UQ = UNIQUE约束
  • V =查看
  • X =扩展存储过程

答案 1 :(得分:8)

检查表级对象是否存在的ISO SQL方法是INFORMATION_SCHEMA.TABLES视图

查看sys.objects没有错误,但是...... INFORMATION_SCHEMA.TABLES更具说明性 - 它是跨平台的(通常根本不重要但是仍然好的。)

我认为这对于新的编码器来说可能更具可读性:

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

不要担心RAISERROR命令 - 它只是一种打印格式化消息的好方法。

您可以查询INFORMATION_SCHEMA视图以了解其中包含的内容。

SELECT TOP 5 * FROM INFORMATION_SCHEMA.TABLES

如您所见 - 您可以按名称引用模式和目录,而不是使用OBJECT_ID()

查找其ID

答案 2 :(得分:2)

object_id = OBJECT_ID(N'[dbo].[YourTable]')

object_idsys.objects

中的列名

OBJECT_ID是一个为您指定的对象返回ID的函数,即YourTable

您正在将YourTable的object_id与object_id表中的sys.objects列进行比较。您需要将YourTable替换为您要检查的表名已存在。

答案 3 :(得分:1)

OBJECT_ID()是一个返回Object ID的函数。请参阅文档:

  

返回架构范围的数据库对象标识号   对象

http://msdn.microsoft.com/en-us/library/ms190328.aspx


通过传递某些参数(即您的表格详细信息),它将返回一个ID。然后,您可以将其与sys.objects表中的ID进行比较,以检查它是否存在。