【问题标题】:Why would IF EXISTS not work?为什么 IF EXISTS 不起作用?
【发布时间】:2009-06-22 23:19:43
【问题描述】:

我尝试在查询 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 程序员。如果它已经存在,我实际上要求你不要创建这个表。 -_-

有什么想法吗?

【问题讨论】:

    标签: sybase


    【解决方案1】:

    您所做的事情的逻辑似乎不太正确。根据您的陈述:

    “我正在尝试在查询 sysobjects 表的位置运行以检查对象是否存在,然后再删除并重新创建它”

    您应该简单地执行删除然后创建。这种方式通常更好,因为它可以确保表会被更新。如果表存在并且您进行了更改,那么您可能没有得到您想要的。

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

    根据您在下面的说明 - 您可以执行以下操作:

    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[XXXX]') 并输入 (N'U')) 删除表 [dbo].[XXXX] 去吧

    创建表 [dbo].[XXXX(... 去吧

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

    【讨论】:

    • 我已经尝试过“如果有,请删除以前的版本,然后安装此版本”和“如果您没有以前的版本,请仅安装此版本”。我只想要一个脚本,我可以一次又一次地运行(用于测试)而不会破坏任何东西(多个系统代码,尝试复制约束的系统错误等)
    • 你的逻辑错了。 if exists 应该用于 drop not create。
    • “如果存在”用于删除,然后创建。否则,它只会创建它。我的逻辑没有错。
    • 作为参考,这里问了同样的问题,我的逻辑。我将提供以下答案:stackoverflow.com/questions/307942/…
    • 您在顶部的代码 sn-p 没有执行删除操作。看起来它只在表不存在时才创建。你脑子里的逻辑可能是对的……你记录的逻辑有点不对。
    【解决方案2】:

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

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

    【讨论】:

    • 这听起来不错.. 但我没有 sybase 的副本来测试这个
    【解决方案3】:

    是的,整批SQL都经过规范化编译,从而为整批创建“执行计划”。在规范化期间,如果“可能的”“create table”语句在编译时已经存在,那么它就是一个问题。

    我的解决方案:重命名 -

    如果存在(从 .... 中选择 1) 开始 删除表 xyz 创建表 xyz_zzzz ( ... ) exec sp_rename 'xyz_zzzz','xyz' 结束

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 2023-03-29
      • 2014-01-17
      • 1970-01-01
      相关资源
      最近更新 更多