2012-07-30 56 views
0

我一直在關注如何創建表,如果它們不存在於當前DataBase中(爲了能夠在不同的數據庫中創建該表,並且可能不具有它們)以及發現,這兩項實用主題的在IF語句中間執行GO命令

所以我做了這個查詢

IF (NOT EXISTS (SELECT * 
      FROM INFORMATION_SCHEMA.TABLES 
      WHERE TABLE_NAME = 'EMAILCONTAS')) 
BEGIN 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[EMAILCONTAS](
    [NRSEQEMAILCONTAS] [numeric](8, 0) NOT NULL, 
    [CDEMAILCONTAS] [varchar](40) NULL, 
    [MSGEMAILCONTAS] [varchar](4000) NOT NULL, 
    [CCOEMAIL] [varchar](100) NULL, 
    [NRSEQOPERADORA] [numeric](8, 0) NOT NULL, 
CONSTRAINT [PK_EMAILCONTAS] PRIMARY KEY CLUSTERED 
(
    [NRSEQEMAILCONTAS] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

ALTER TABLE [dbo].[EMAILCONTAS] WITH CHECK ADD FOREIGN KEY([NRSEQOPERADORA]) 
REFERENCES [dbo].[OPERADORA] ([NRSEQOPERADORA]) 
GO 

ALTER TABLE [dbo].[EMAILCONTAS] WITH CHECK ADD CONSTRAINT [FK_EMAILCONTAS_OPERADORA] FOREIGN KEY([NRSEQOPERADORA]) 
REFERENCES [dbo].[OPERADORA] ([NRSEQOPERADORA]) 
GO 

ALTER TABLE [dbo].[EMAILCONTAS] CHECK CONSTRAINT [FK_EMAILCONTAS_OPERADORA] 
GO 
END 

但是當我執行它時,我在錯誤列表中找到了它。

Msg 102, Level 15, State 1, Line 5 
Incorrect syntax near 'ON'. 

但無論如何創建我的表(我把「從PERSON選擇*」;上面的代碼後,檢查錯誤可能會阻止下一個腳本編譯或不和錯誤阻止它。 。顯示此錯誤:

Msg 156, Level 15, State 1, Line 3 
Incorrect syntax near the keyword 'Select'. 

有一種方法,以避免它)?當我執行這個查詢和表已經存在時,我得到了以下錯誤。

Msg 102, Level 15, State 1, Line 5 
Incorrect syntax near 'ON'. 
Msg 2714, Level 16, State 6, Line 2 
There is already an object named 'EMAILCONTAS' in the database. 
Msg 2714, Level 16, State 5, Line 2 
There is already an object named 'FK_EMAILCONTAS_OPERADORA' in the database. 
Msg 1750, Level 16, State 0, Line 2 
Could not create constraint. See previous errors. 

我怎麼能做到這一點沒有得到這些錯誤?有沒有一種方法可以像這樣創建多個代碼而沒有問題?我究竟做錯了什麼?

回答

2

GO類似於腳本的末尾;您可以從BEGIN-END語句中刪除GO

如果您確實需要有GO中的代碼,你可以打破你的查詢爲:

IF (criteria) 
BEGIN 
    ... 
END 

GO 

IF (newcriteria) 
BEGIN 
    ... 
END 
+0

非常感謝,這是有效的。我正在把你的答案作爲正確的答案,因爲「GO」的解釋 – 2012-07-30 13:33:53

1

我在哪裏工作,所有的腳本都必須有這個檢查。我在這個例子中,像這樣的檢查之前都設置:

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DimTime]') AND type in (N'U')) 
    BEGIN 
     Create Table [dbo].[DimTime] 
     (
      TimeID int PRIMARY KEY IDENTITY(1,1), 
      Month int, 
      Year int, 
      Day int, 
     ) 
    END 
+0

非常感謝你,這工作。 – 2012-07-30 13:33:22