为什么IF EXISTS不起作用?

时间:2009-06-17 01:26:57

标签: sybase

我正在尝试运行很多代码,我在查询sysobjects表时检查对象是否存在,然后再将其删除并重新创建。

问题是,有时如果我去:

if not exists (select name from sysobjects o where o.name = 'my_table' and o.type =  'U') 
CREATE TABLE my_table (..)
go

它有效,不用担心。然而,当我再次回来再次运行时,我得到了这个可爱的错误:

SQL Server Error on (myserver) Error:2714 at Line:10 Message:There is already an object named 'my_table' in the database.

谢谢你,SQL程序员。我实际上要求你不要创建这个表,如果它已经存在。 -_-

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

你正在做的事情的逻辑似乎并不恰当。根据你的陈述:

“我正在尝试运行我正在查询sysobjects表以检查对象是否存在,然后再将其删除并再次创建”

你应该简单地做一个删除后跟一个创建。这种方式通常更好,因为它可以确保更新表。如果表存在且你有变化,你可能没有得到你想要的东西。

您遇到的直接问题是假设的数据库所有权在运行之间不一致。

根据您在下面的说明 - 以下是您可以做的事情:

IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo]。[XXXX]')并输入(N'U')) DROP TABLE [dbo]。[XXXX] GO

CREATE TABLE [dbo]。[XXXX(... GO

你可以一遍又一遍地运行......

答案 1 :(得分:0)

sybase解析器对象验证传递是全局的,不基于条件评估。即使您的代码无法执行CREATE TABLE,仍会检查语句的语法和适用性,当系统发现该表已存在时,该语法和适用性将失败。

我知道的唯一解决方法是将您的create语句放在EXEC()中,只有在执行该部分时才会对其进行评估。

答案 2 :(得分:0)

是的,整批SQL被规范化并编译,以便为整个批次创建“执行计划”。在规范化期间,如果“可能的”“创建表”语句在编译时已存在,则该问题是一个问题。

我的解决方案:重命名 -

如果存在(从......中选择1) 开始   drop table xyz   创建表xyz_zzzz(...)   exec sp_rename'xyz_zzzz','xyz' 端