我希望这是关于如何使用 SQL 语句检查 SQL Server 2000/2005 中是否存在表的最终讨论。
当您用 Google 搜索答案时,会得到很多不同的答案。有官方 / 向后和向前兼容的方式吗?
这是两种可能的方法。两种方法中的哪一种是标准 / 最佳方法?
第一种方式:
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%';
声明。我正在寻找类似的东西。
对于此类查询,最好始终使用INFORMATION_SCHEMA
视图。这些视图(大多数情况下)是跨许多不同数据库的标准视图,并且很少因版本而异。
要检查表是否存在,请使用:
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'TheSchema'
AND TABLE_NAME = 'TheTable'))
BEGIN
--Do Stuff
END
另请注意,如果出于任何原因需要检查临时表,可以执行以下操作:
if OBJECT_ID('tempdb..#test') is not null
--- temp table exists
只要我记得我们一直使用OBJECT_ID
样式
IF OBJECT_ID('*objectName*', 'U') IS NOT NULL
请查看以下方法,
方法 1:使用 INFORMATION_SCHEMA.TABLES 视图
我们可以编写如下查询,以检查当前数据库中是否存在客户表。
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
PRINT 'Table Exists'
END
方法 2:使用 OBJECT_ID()函数
我们可以使用如下所示的 OBJECT_ID()函数来检查当前数据库中是否存在客户表。
IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
方法 3:使用 sys.Objects 目录视图
我们可以使用 Sys.Objects 目录视图来检查表的存在,如下所示:
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.tables 目录视图
我们可以使用 Sys.Tables 目录视图来检查 Table 的存在,如下所示:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'Customers' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
方法 5:避免使用 sys.sysobjects 系统表
我们应该避免直接使用 sys.sysobjects 系统表,在某些将来的 Sql Server 版本中将不建议直接使用它。根据 Microsoft BOL 链接,Microsoft 建议直接使用目录视图 sys.objects / sys.tables 而不是 sys.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/
在其他数据库上查找表:
if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
print 'Exists'
只是想提到一种情况,使用OBJECT_ID
方法可能会更容易一些。 INFORMATION_SCHEMA
视图是每个数据库下的对象 -
信息模式视图是在名为 INFORMATION_SCHEMA 的特殊模式中定义的。该模式包含在每个数据库中。
https://msdn.microsoft.com/zh-CN/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]
。如果要检查另一个数据库中的表是否存在,而又不每次都动态更改[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 年开始,Microsoft 通过将if exists
关键字添加到drop
语句,简化了在删除之前检查不存在的对象的功能。例如,
drop table if exists mytablename
在 1 行代码中将执行与OBJECT_ID
/ INFORMATION_SCHEMA
包装器相同的操作。
IF OBJECT_ID('mytablename') IS NOT NULL
使用信息架构是 SQL 标准的实现方式,因此,支持它的所有数据库都应使用它。
IF EXISTS
(
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]')
AND
type in (N'U')
)
BEGIN
-- Do whatever you need to here.
END
在上面的代码中,表名称为Mapping_APCToFANavigator
。
如果您需要在其他数据库上工作:
DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'
DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'
DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_CATALOG = @Catalog
AND TABLE_SCHEMA = @Schema
AND TABLE_NAME = @Table))
BEGIN
--do stuff
END