Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果两个架构中存在名称相似的表,则删除该表_Sql_Sql Server 2008_Tsql - Fatal编程技术网

Sql 如果两个架构中存在名称相似的表,则删除该表

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] 及 那么,您对检查此表是否存在的建议是什么?如何使用模式检查表名 更新: 好的

我使用此命令在SQLServer2008中删除一个表

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]