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

在寻找这个问题的答案时,我在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,尤其如此。 但是我也希望看到其他数据库系统的类似操作,如果存在这种情况的话。

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


通过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的形式执行一个字符串,但作为一个字符串,它在执行之前不会被执行,因此字符串中提到的表不需要在编译时存在。 这允许在创建表之前定义存储的proc。


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

if exists (select * from dbname.sys.tables where name='tablename')
begin
select * from dbname.dbo.tablename
end
链接地址: http://www.djcxy.com/p/94453.html

上一篇: Check if table exists, before performing operations on it?

下一篇: Check if a table exists within a database using LINQ