4

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

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

4

2 回答 2

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

EXEC()函数将字符串作为 SQL 执行,但作为一个字符串,它在执行之前不会被评估,因此字符串中提到的表在编译时不需要存在。这允许在创建表之前定义存储过程。

于 2012-05-18T23:43:30.383 回答
0

我在本地服务器上对此进行了测试,它似乎可以工作:

if exists (select * from dbname.sys.tables where name='tablename')
begin
select * from dbname.dbo.tablename
end
于 2012-05-18T23:42:20.530 回答