我希望这是关于如何使用SQL语句检查SQL Server 2000/2005中是否存在表的最终讨论。
这里有两种可能的方法。哪一种是做这件事的标准/最佳方式?
第一个方法:
IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
第二种方式:
IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
MySQL提供简单的
SHOW TABLES LIKE '%tablename%';
声明。我在找类似的东西。
只是想提到一种情况,在这种情况下使用OBJECT_ID方法可能会更容易一些。INFORMATION_SCHEMA视图是每个数据库-下的对象
信息模式视图定义在一个名为
INFORMATION_SCHEMA。这个模式包含在每个数据库中。
https://msdn.microsoft.com/en-us/library/ms186778.aspx
因此,您访问的所有表都使用
IF EXISTS (SELECT 1
FROM [database].INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
将只反映什么是在[数据库]。如果您想检查另一个数据库中是否存在表,而不需要每次都动态更改[database], OBJECT_ID将允许您开箱操作。除
IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
效果和
IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
SQL SERVER 2016编辑:
从2016年开始,微软通过添加if exists关键字来删除语句,简化了在删除之前检查不存在对象的功能。例如,
drop table if exists mytablename
将在一行代码中完成与OBJECT_ID / INFORMATION_SCHEMA包装器相同的事情。
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
-- -- create过程检查表是否存在
DELIMITER $$
DROP PROCEDURE IF EXISTS `checkIfTableExists`;
CREATE PROCEDURE checkIfTableExists(
IN databaseName CHAR(255),
IN tableName CHAR(255),
OUT boolExistsOrNot CHAR(40)
)
BEGIN
SELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLES
WHERE (TABLE_SCHEMA = databaseName)
AND (TABLE_NAME = tableName);
END $$
DELIMITER ;
-- --如何使用:检查表迁移是否存在
CALL checkIfTableExists('muDbName', 'migrations', @output);