在执行操作之前检查表是否存在?
在寻找这个问题的答案时,我在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?