39

我需要检查 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

4 回答 4

89

我喜欢这种语法:

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

其中 object_id 将对象的 2 char 类型作为第二个参数。您可以在sys.objects 文档中找到下面列出的对象类型列表:

  • 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 表值函数
  • TR = SQL DML 触发器
  • TT = 表类型
  • U = 表(用户定义)
  • UQ = UNIQUE 约束
  • V = 查看
  • X = 扩展存储过程
于 2013-12-09T19:41:05.620 回答
9

检查表级对象是否存在的 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

于 2013-07-09T12:42:59.657 回答
3
object_id = OBJECT_ID(N'[dbo].[YourTable]')

object_id是列名sys.objects

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

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

于 2013-07-09T11:17:31.760 回答
1

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

返回模式范围对象的数据库对象标识号。

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


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

于 2013-07-09T11:18:30.273 回答