我使用此命令在sql-server 2008中删除表
IF EXISTS(SELECT name FROM [DBName]..sysobjects WHERE name = N'TableName' AND xtype='U') DROP TABLE [DBName].[SchemaName].[TableName];
但是现在我在不同的架构中有2个具有相同名称的表:
[DBName].[Schema1].[Members]
和
[DBName].[Schema2].[Members]
那么,您对检查此表是否存在的建议是什么?如何使用架构检查表名?
更新:
好的,有3个不同的答案,并且所有答案都有效,所以我不知道哪个更好,有人知道使用object_id或sys.tables吗?
object_id
sys.tables
IF EXISTS( SELECT * FROM [DBName].sys.tables t JOIN [DBName].sys.schemas s ON t.SCHEMA_ID = s.schema_id WHERE t.name = N'TableName' AND t.type='U' AND s.NAME = 'SchemaName' ) DROP TABLE [DBName].[SchemaName].[TableName];
object_id在sys.tables相同object_id的sysobjects同一个表。并且与函数OBJECT_ID返回相同的表名完全相同。请参阅以下说明示例。
sysobjects
因此,您可以简化查询:
IF exists ( SELECT * FROM DBName.sys.tables WHERE object_id = OBJECT_ID('[DBName].[SchemaName].[TableName]') AND type = 'U' ) DROP TABLE [DBName].[SchemaName].[TableName];
或以这种方式:
IF exists ( SELECT * FROM DBName.sys.objects WHERE object_id = OBJECT_ID('[DBName].[SchemaName].[TableName]') AND type = 'U' ) DROP TABLE [DBName].[SchemaName].[TableName];
或对于sql2000样式的表:
IF exists ( SELECT * FROM DBName..sysobjects WHERE object_id = OBJECT_ID('[DBName].[SchemaName].[TableName]') AND xtype = 'U' ) DROP TABLE [DBName].[SchemaName].[TableName];