我使用此命令删除 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
?
最佳答案
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.tables
中的 object_id
与 sysobjects
中的 object_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];
关于sql - 如果两个模式中存在名称相似的表,则删除表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451283/