在搜索此问题的答案时,我发现了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。但是,如果存在这样的事情,我还希望看到其他数据库系统的类似操作。
这个问题背后的动机是因为我们有多个数据库,其中包含彼此的子集。表。我想要的是有一个可以应用于所有数据库的脚本,并且只修改了那里存在的表(并且在执行时不会出错)。
答案 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