2017-03-02 102 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 (...)