sql – 在对表执行操作之前检查表是否存在?

在寻找这个问题的答案时,我发现了这个popular post on StackOverflow.不幸的是,它并没有完全发挥作用.问题是:

有没有办法在执行修改(例如INSERT)之前检查是否存在表(或其他对象)?前面提到的帖子暗示:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'dbo' 
                 AND  TABLE_NAME = 'questionableTable'))
BEGIN
    INSERT INTO dbo.questionableTable VALUES ('success!');
END

错误:无效的对象名称’dbo.questionableTable’.

这个问题是SQL Server在解析INSERT语句时失败,说明dbo.questionableTable不存在.之前的INFORMATION_SCHEMA检查似乎不会影响它.

有没有办法写这种查询?特别是对于SQL Server.但是,如果存在这样的事情,我还希望看到其他数据库系统的类似操作.

这个问题背后的动机是因为我们有多个数据库,其中包含彼此表的子集.我想要的是有一个可以应用于所有数据库的脚本,并且只修改了那里存在的表(并且在执行时不会出错).

最佳答案
通过EXEC()函数使用动态SQL:

IF (EXISTS (SELECT * 
            FROM INFORMATION_SCHEMA.TABLES 
            WHERE TABLE_SCHEMA = 'dbo' 
            AND TABLE_NAME = 'questionableTable'))
BEGIN
    EXEC('INSERT INTO dbo.questionableTable VALUES (''success!'')');
END

EXEC()函数将字符串作为SQL执行,但作为字符串,在执行之前不会对其进行求值,因此字符串中提到的表不需要在编译时存在.这允许在创建表之前定义存储过程.

转载注明原文:sql – 在对表执行操作之前检查表是否存在? - 代码日志