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

时间:2012-05-18 23:25:23

标签: sql sql-server tsql

在搜索此问题的答案时,我发现了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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

通过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执行,但作为字符串,在执行之前不会对其进行求值,因此字符串中提到的表不需要在编译时存在时间。这允许将存储过程之前定义为正在创建的表。

答案 1 :(得分:0)

我在我的本地服务器上测试了它,它似乎有效:

if exists (select * from dbname.sys.tables where name='tablename')
begin
select * from dbname.dbo.tablename
end