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

voi*_*hos 4 sql t-sql sql-server

在搜索这个问题的答案时,我在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
Run Code Online (Sandbox Code Playgroud)

错误: Invalid object name 'dbo.questionableTable'.

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

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

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

Boh*_*ian 5

通过以下函数使用动态 SQL EXEC():

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

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