我正在尝试运行很多代码,我在查询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程序员。我实际上要求你不要创建这个表,如果它已经存在。 -_-
有什么想法吗?
答案 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' 端