TSQL实现表存在则清空不存在则创建时报同名对象已存在错误求助
问题根因
- 报错核心原因是
GO关键字是SQL Server的批处理分隔符,会将当前脚本拆分为多个独立执行的批,直接打断了IF-ELSE的逻辑作用域:- 原脚本中
ELSE分支仅包含SET ANSI_NULLS ON这一行,到第一个GO就结束了当前批处理 - 后续的
CREATE TABLE语句属于完全独立的新批,无论表是否存在都会强制执行,所以表已存在时就会触发「数据库中已存在名为'Com_SQL_Server_Agent_Monitor'的对象」的报错
- 原脚本中
- 额外说明:
SET ANSI_NULLS ON和SET QUOTED_IDENTIFIER ON是会话级配置,不需要写在IF分支内,提前全局设置即可。
修复后的可用代码
-- 提前全局设置会话配置 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- 表存在则清空,不存在则创建 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Com_SQL_Server_Agent_Monitor]') AND type in (N'U')) BEGIN TRUNCATE TABLE [dbo].[Com_SQL_Server_Agent_Monitor] END ELSE BEGIN CREATE TABLE [dbo].[Com_SQL_Server_Agent_Monitor] ( [job_id] [uniqueidentifier] NULL, [originating_server] [nvarchar](30) NULL, [name] [nvarchar](128) NULL, [enabled] [tinyint] NULL, [description] [nvarchar](512) NULL, [start_step_id] [int] NULL, [category] [nvarchar](128) NULL, [owner] [nvarchar](128) NULL, [notify_level_eventlog] [int] NULL, [notify_level_email] [int] NULL, [notify_level_netsend] [int] NULL, [notify_level_page] [int] NULL, [notify_email_operator] [nvarchar](128) NULL, [notify_netsend_operator] [nvarchar](128) NULL, [notify_page_operator] [nvarchar](128) NULL, [delete_level] [int] NULL, [date_created] [datetime] NULL, [date_modified] [datetime] NULL, [version_number] [int] NULL, [last_run_date] [int] NULL, [last_run_time] [int] NULL, [last_run_outcome] [int] NULL, [next_run_date] [int] NULL, [next_run_time] [int] NULL, [next_run_schedule_id] [int] NULL, [current_execution_status] [int] NULL, [current_execution_step] [nvarchar](128) NULL, [current_retry_attempt] [int] NULL, [has_step] [int] NULL, [has_schedule] [int] NULL, [has_target] [int] NULL, [type] [int] NULL ) ON [PRIMARY] END GO
内容的提问来源于stack exchange,提问作者Error 1004
相关产品推荐
相关产品推荐

