我希望这是关于如何使用SQL语句检查SQL Server 2000/2005中是否存在表的最终讨论。

这里有两种可能的方法。哪一种是做这件事的标准/最佳方式?

第一个方法:

IF EXISTS (SELECT 1 
           FROM INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

第二种方式:

IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

MySQL提供简单的

SHOW TABLES LIKE '%tablename%'; 

声明。我在找类似的东西。


当前回答

我知道这是一个老问题,但如果你计划经常打电话,我发现这种可能性。

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go

其他回答

如果你需要使用不同的数据库:

DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'

DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'

DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES   
    WHERE TABLE_CATALOG = @Catalog 
      AND TABLE_SCHEMA = @Schema 
      AND TABLE_NAME = @Table))
BEGIN
   --do stuff
END

如果有人试图在linq to sql(或特别是linqpad)中做同样的事情,打开选项,包括系统表和视图,并执行以下代码:

let oSchema = sys.Schemas.FirstOrDefault(s=>s.Name==a.schema )
where oSchema !=null
let o=oSchema!=null?sys.Objects.FirstOrDefault (o => o.Name==a.item && o.Schema_id==oSchema.Schema_id):null
where o!=null

假设您有一个对象,其名称在名为item的属性中,而模式在名为schema的属性中,其中源变量名为a

假设在一个数据库中有一个表t1。你想在其他数据库上运行脚本,比如-如果t1存在,那么什么都不做,创建t1。 要做到这个开放的视觉工作室,要做到以下几点:

右键单击t1,然后Script table as,然后DROP和Create To,然后新建查询编辑器

您将找到所需的查询。但是在执行该脚本之前,不要忘记注释掉查询中的drop语句,因为如果已经有一个drop语句,则您不想创建新的drop语句。

谢谢

如果这是“终极”讨论,那么应该注意,如果服务器是链接的,Larry Leonard的脚本也可以查询远程服务器。

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
IF OBJECT_ID('mytablename') IS NOT NULL