2017-08-11 162 views
0

關於與this question:我嘗試使用下面的查詢我的SQL Server查詢,如果表不存在識別

IF NOT EXISTS(
    SELECT T.name FROM SYS.TABLES T JOIN SYS.SCHEMAS S ON (T.SCHEMA_ID = S.SCHEMA_ID) 
    WHERE S.NAME = 'DBO' AND T.NAME = 'sample2Prot' 
    ) 
BEGIN CREATE TABLE[TCPDUMP].[dbo].[sample2Prot] 
    (
    [IdTransmission] INT IDENTITY(1, 1) NOT NULL, 
    [timestp] NVARCHAR(32) NULL, 
    [idq] NVARCHAR(32) NULL, 
    [idz] NVARCHAR(32) NULL, 
    [prot] NVARCHAR(32) NULL, 
    [Lhowmany] NVARCHAR(32) NULL, 
    [Rhowmany] NVARCHAR(32) NULL, 
    CONSTRAINT[PK_TCPDump] PRIMARY KEY CLUSTERED([IdTransmission] ASC) 
    ) 
END; 

CREATE my_table.."部分作品,但如果該表已經存在,程序在執行期間引發錯誤:看起來「if not exists」語句不起作用。任何人都有解釋?

隨意問更多細節

Teh error <3

+0

'和t.name = my_table'似乎缺少引號。除此之外,我無法複製您的問題:此聲明不會嘗試創建已存在的表。 'IF(OBJECT_ID('dbo.mytable','U')IS NULL)'是一個較短的選擇。你是否試圖在錯誤的數據庫中執行這條語句,或者在沒有權限對該表執行任何操作的帳戶下執行該語句? –

+0

您還需要創建一個表格作爲CREATE TABLE my_table ... – Leonidas199x

+0

@ Leonidas199x我沒有複製這篇文章,因爲這部分似乎工作,但查詢的其餘部分存在x) –

回答

1

您所提供的示例腳本是非法的語法,所以我們只能猜測,爲什麼按照預期的實際腳本不起作用,假設實際的語法是有效的。我希望這種方式來工作,但可以如下重構:

IF OBJECT_ID(N'dbo.my_table', 'U') IS NULL 
BEGIN 
    CREATE TABLE dbo,my_table(col1 int); 
END; 

編輯: 在修改後的問題實際腳本顯示錶名是合格與數據庫名稱,但系統目錄視圖不。因此,檢查當前數據庫是否存在對象,如果腳本從不同的數據庫上下文運行並且該表已存在,則會出現錯誤。修改的腳本爲:

IF NOT EXISTS(
    SELECT T.name FROM TCPDUMP.sys.tables T JOIN TCPDUMP.sys.schemas S ON (T.SCHEMA_ID = S.SCHEMA_ID) 
    WHERE S.NAME = 'dbo' AND T.NAME = 'sample2Prot' 
    ) 
BEGIN CREATE TABLE[TCPDUMP].[dbo].[sample2Prot] 
    (
    [IdTransmission] INT IDENTITY(1, 1) NOT NULL, 
    [timestp] NVARCHAR(32) NULL, 
    [idq] NVARCHAR(32) NULL, 
    [idz] NVARCHAR(32) NULL, 
    [prot] NVARCHAR(32) NULL, 
    [Lhowmany] NVARCHAR(32) NULL, 
    [Rhowmany] NVARCHAR(32) NULL, 
    CONSTRAINT[PK_TCPDump] PRIMARY KEY CLUSTERED([IdTransmission] ASC) 
    ) 
END; 

另外,請注意本例中系統目錄視圖和模式名稱的小寫。這將確保腳本在具有區分大小寫的排序規則的數據庫上成功。

您也可以使用OBJECT_ID功能有3部分組成的名稱:

IF OBJECT_ID(N'TCPDUMP.dbo.my_table', 'U') IS NULL 
0

無法使用此代碼複製:

IF NOT EXISTS(SELECT T.name FROM SYS.TABLES T JOIN SYS.SCHEMAS S ON (T.SCHEMA_ID = S.SCHEMA_ID) WHERE S.NAME = 'DBO' AND T.NAME = 'MY_TABLE') 

BEGIN 
    PRINT 'Creating table' 
    CREATE TABLE MY_TABLE 
    (
     ID INT 
    ) 
END 

如果不工作,你可以告訴你的是什麼版本運行和提供的確切消息?

+0

我怎樣才能看到我正在運行的版本?我正在使用Microsoft Visual Studio 2015,但idk爲sql服務器。 –

+0

運行 - SELECT @@ VERSION在SSMS中 – Leonidas199x