Sql 检查表是否存在,然后再对其执行操作?

Sql 检查表是否存在,然后再对其执行操作?,sql,sql-server,tsql,Sql,Sql Server,Tsql,在寻找这个问题的答案时,我发现了这个。不幸的是,它并不完全有效。问题是: 在执行修改(例如,INSERT)之前,是否有方法检查表(或其他对象)是否存在?前面提到的帖子表明: IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'questionabl

在寻找这个问题的答案时,我发现了这个。不幸的是,它并不完全有效。问题是:

在执行修改(例如,
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\u SCHEMA
检查似乎不会影响它

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


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

我在本地服务器上测试了这个脚本,它似乎可以工作:

if exists (select * from dbname.sys.tables where name='tablename')
begin
select * from dbname.dbo.tablename
end
通过函数使用动态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的形式执行字符串,但作为字符串,在执行之前不会对其求值,因此字符串中提到的表不需要在编译时存在。这允许在创建表之前定义存储的过程。

我无法重新创建您的问题。当我尝试“如果(存在…”代码片段工作正常?@rontornanbe:您使用的是什么DB客户端?
sqlcmd
或其他什么?我正在SQL Server 2005实例上使用SQL Server Management Studio 2008。@rontornanbe:Ahh…对不起,我搞错了支票的命名。我的错误…这个问题无效,但我无法删除它,所以我标记了它。我正在使用本地(2008)数据库实例上的Mgmt.Studio 2008 R2。也许您可以尝试创建2008数据库,然后重试此代码。@Kev我不明白您为什么关闭此问题!此问题(或我的答案)没有“本地化”内容这是一个在存储过程中引用表之前创建的一般问题。考虑使用SPEXECUTESQL而不是只执行Excel。它既有表也有表存在?没有表它什么也没返回,也没有错误。