voi*_*hos 4 sql t-sql sql-server
在搜索这个问题的答案时,我在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
Run Code Online (Sandbox Code Playgroud)
错误: Invalid object name 'dbo.questionableTable'.
这个问题是SQL Server在解析INSERT语句时失败,说明它dbo.questionableTable不存在.以前的INFORMATION_SCHEMA检查似乎不会影响它.
有没有办法写这种查询?特别是对于SQL Server.但是,如果存在这样的事情,我还希望看到其他数据库系统的类似操作.
这个问题背后的动机是因为我们有多个数据库,其中包含彼此表的子集.我想要的是有一个可以应用于所有数据库的脚本,并且只修改了那里存在的表(并且在执行时不会出错).
通过以下函数使用动态 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
Run Code Online (Sandbox Code Playgroud)
该EXEC()函数将字符串作为SQL执行,但作为字符串,在执行之前不会对其进行求值,因此字符串中提到的表不需要在编译时存在.这允许在创建表之前定义存储过程.