Sql 如果两个架构中存在名称相似的表,则删除该表
我使用此命令在SQLServer2008中删除一个表Sql 如果两个架构中存在名称相似的表,则删除该表,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我使用此命令在SQLServer2008中删除一个表 IF EXISTS(SELECT name FROM [DBName]..sysobjects WHERE name = N'TableName' AND xtype='U') DROP TABLE [DBName].[SchemaName].[TableName]; 但现在我有两个不同模式中同名的表: [DBName].[Schema1].[Members] 及 那么,您对检查此表是否存在的建议是什么?如何使用模式检查表名 更新: 好的
IF EXISTS(SELECT name FROM [DBName]..sysobjects WHERE name = N'TableName' AND xtype='U')
DROP TABLE [DBName].[SchemaName].[TableName];
但现在我有两个不同模式中同名的表:
[DBName].[Schema1].[Members]
及
那么,您对检查此表是否存在的建议是什么?如何使用模式检查表名
更新:
好的,有3种不同的答案,它们都有效,所以我不知道哪一种更好,有人知道使用object\u 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];
更新:
sys.表格中的object\u id
与同一表格中的sysobjects
中的object\u id
相同。和对于相同的表名返回的函数OBJECT_ID完全相同。请参见以下示例
因此,您可以简化查询:
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];
使用以下命令:
IF EXISTS
(
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[DBName].[Schema1].[Member]')
AND type in (N'U')
)
PRINT 'Yes'
ELSE
PRINT 'No';
不要使用sysobjects
。在sys
模式中使用现代模式(2005年推出):
只要在2005年或更高版本的数据库中有一个“现代”模式,就无法可靠地使用sysobjects
与模式匹配。如果您只有“旧”模式(属于用户和角色的对象),那么您可以基于用户id
进行查询,这难道不简单吗
IF object_id('[schema].[table]') > 0
DROP TABLE [schema].[table]
对于不存在的表object\u id()
返回NULL
对于某些系统表,它返回一个负的int
小心-由于使用DB名称限定对象-它可能从其他DB运行,其中SCHEMA_ID无效,甚至是不正确的,我绝对建议使用sys.tables
,因为根据定义,在其中找到的任何东西都是一个表,因此,不需要在这方面进行进一步检查。@Damien_不信者您应该用DB来限定您的sys.tables
name@dotNetist小心-由于使用DB名称限定对象-它可能从其他DB运行,因此-您需要使用DB名称限定sys.objects
表
select * from sys.tables
where
schema_id = SCHEMA_ID('Schema1') and
name='tablename'
IF object_id('[schema].[table]') > 0
DROP TABLE [schema].[table]