2017-03-02 95 views
0

我有这样的代码,我从MySQL转换:的SQL Server:检查表存在,否则创建

IF NOT EXISTS (SELECT * 
       FROM INFORMATION_SCHEMA.TABLES 
       WHERE TABLE_SCHEMA = 'TheSchema' 
       AND TABLE_NAME = 'odds_soccer') 
    CREATE TABLE "odds_soccer" (...) 

唯一的问题是...如果我尝试运行它两次,它会难倒第二次与错误

消息2714,级别16,状态6,行1
已经有一个在数据库中名为 'odds_soccer' 的对象。

因为我实际上在SO上找到了我的解决方案,所以我不确定为什么代码不工作。

我目前正在从Microsoft SQL Server Management Studio中选择我的数据库作为查询来运行它。

+0

如果我放弃模式部件 - 并使用此 - 它似乎工作: IF(NOT(EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME =“odds_soccer '))) 因为这实际上是由软件生成的代码,对底层数据库没有特别的了解(odds_soccer只是一个例子,可以是任何数据,列等)----这不是最兼容的代码生成/使用? – Tom

回答

7

为了创建表

IF NOT EXISTS (SELECT 'X' 
        FROM INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_NAME = 'table_name' 
          AND TABLE_SCHEMA = 'schema') 
BEGIN 
    create.. 
END 

对于下降现有的表创建新表

IF Object_id('TEMPDB.schema_name.table', 'U') IS NOT NULL 
    DROP TABLE table; 
+0

与当前代码相同的问题。 (注意:我不想先丢掉表格。) – Tom

+0

@tom然后你期待什么你可以elobarate – Chanukya

+0

我只想创建一个表,如果它不存在。如果它已经存在,我想保留它和数据。 (并简单地添加我有的数据) – Tom

1

颇为惊讶,因为它应该工作,但它可能会依赖于SQL-Server版本。

目前我使用的脚本是这样的:

DECLARE @SchemaID int = (SELECT schema_id FROM sys.schemas WHERE name = 'X') 

IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Y' AND schema_id = @SchemaID) 
BEGIN 
    CREATE TABLE... 
END 
GO 

但基本上是一样的。

+0

我会尝试 – Tom

3

SELECT查询查找的'TheSchema'模式中的表,而在默认模式,通常dbo创建表,因为没有架构名称在CREATE语句中指定。

尝试使用这个脚本:

IF NOT EXISTS (SELECT * 
       FROM INFORMATION_SCHEMA.TABLES 
       WHERE TABLE_SCHEMA = 'TheSchema' 
       AND TABLE_NAME = 'odds_soccer') 
    CREATE TABLE [TheSchema].odds_soccer (...)