我使用此命令删除sql-server 2008中的表
IF EXISTS(SELECT name FROM [DBName]..sysobjects WHERE name = N'TableName' AND xtype='U')
DROP TABLE [DBName].[SchemaName].[TableName];
但是现在我在不同架构中有两个同名的表:
[DBName].[Schema1].[Members]
和
[DBName].[Schema2].[Members]
那么,你有什么建议检查这个表是否存在?如何使用架构检查表名?
更新
好的,有3个不同的答案,所有这些都有效,所以我不知道哪个更好,有人知道使用object_id
还是sys.tables
?
答案 0 :(得分:1)
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
中的{p> sys.tables
与object_id
中同一个表中的sysobjects
相同。并且与函数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];
答案 1 :(得分:1)
使用此:
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';
答案 2 :(得分:1)
请勿使用sysobjects
。使用sys
架构中的现代system views(2005年推出):
select * from sys.tables
where
schema_id = SCHEMA_ID('Schema1') and
name='tablename'
只要在2005或更高版本的数据库中有一个“现代”模式,就不能可靠地使用sysobjects
来匹配模式。如果您只有“旧”架构(属于用户和角色的对象),您可以根据user_id
进行查询。
答案 3 :(得分:0)
最简单的只是:
IF object_id('[schema].[table]') > 0
DROP TABLE [schema].[table]
对于不存在的表object_id()
,返回NULL
对于某些系统表,它返回负int