IF-THEN-ELSE:创建/截断表 - SQL Server

时间:2016-03-09 15:59:47

标签: sql sql-server tsql

我正在尝试创建一个备份表,而不必每次都重新创建它。如果表在下一次运行中已经存在,那么它应该只是截断表。

但它似乎没有起作用。它说backup_reportsettings已经在数据库中了。任何人都可以帮助我吗?

--Only re-create table if table does not exist otherwise truncate the existing table.   
IF NOT EXISTS (SELECT * FROM [Misc].sys.tables where name= 'dbo.backup_reportsettings')
    CREATE TABLE [MISC].dbo.backup_reportsettings 
    (
        [datestamp] [datetime] NULL,
        [reportsettingid] [char](8) NOT NULL,
        [description] [char](30) NOT NULL,
        [formname] [char](30) NOT NULL,
        [usersid] [char](8) NOT NULL,
        [settings] [text] NOT NULL,
        [notes] [varchar](255) NOT NULL,
        [userdefault] [char](1) NOT NULL
    )
ELSE 
    TRUNCATE TABLE [Misc].dbo.backup_reportsettings;

我做错了什么?注意:这是在交易中完成的。

2 个答案:

答案 0 :(得分:4)

sys.tables中的对象名称不具有作为名称一部分的架构。验证表是否存在时删除表模式:

IF NOT EXISTS (SELECT * FROM [Misc].sys.tables where name= 'backup_reportsettings')

答案 1 :(得分:3)

尽管使用了IF,但SQL Server需要解析/编译脚本中的所有语句,因此当它看到CREATE TABLE语句时,如果表已经存在,它会给你一个编译错误,即使IF会在这种情况下阻止执行代码。

解决这个问题的方法是将CREATE TABLE语句放在动态SQL中,在执行之前不会对其进行解析/编译。