我希望这是关于如何使用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%';
声明。我在找类似的东西。
请参阅以下方法,
方法1:使用INFORMATION_SCHEMA。表视图
我们可以像下面这样编写一个查询来检查当前数据库中是否存在Customers Table。
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
PRINT 'Table Exists'
END
方法2:使用OBJECT_ID()函数
我们可以像下面这样使用OBJECT_ID()函数来检查当前数据库中是否存在customer Table。
IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
方法3:使用sys。对象目录视图
我们可以用Sys。查看对象目录,检查Table是否存在,如下所示:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
方法4:使用sys。表目录视图
我们可以用Sys。查看表目录,检查表是否存在,如下图所示:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'Customers' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
方法5:避免使用sys. exe。sysobjects系统表
我们应该避免使用sys。直接访问sysobjects系统表,在将来的Sql Server版本中将不支持直接访问。根据微软BOL链接,微软建议使用目录视图sys.objects/sys. js。而不是sys. Tables。Sysobjects系统表直接。
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
参考来源:http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
我以创建一个视图为例。
因为ALTER/CREATE命令不能在BEGIN/END块中。在创建之前,您需要测试是否存在并删除它
IF Object_ID('TestView') IS NOT NULL
DROP VIEW TestView
GO
CREATE VIEW TestView
as
. . .
GO
如果您担心权限丢失,您也可以编写GRANT语句,并在最后重新运行它们。
你可以把create/alter包装成一个字符串,然后执行EXEC——对于大的视图来说,这可能会很难看
DECLARE @SQL as varchar(4000)
-- set to body of view
SET @SQL = 'SELECT X, Y, Z FROM TABLE'
IF Object_ID('TestView') IS NULL
SET @SQL = 'CREATE VIEW TestView AS ' + @SQL
ELSE
SET @SQL = 'ALTER VIEW TestView AS ' + @SQL