2012-07-30 59 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