GO-Befehle in der Mitte einer IF-statement

Ich habe auf SO gesucht, um Tabellen nur dann zu erstellen, wenn sie nicht auf der aktuellen DataBase existieren (um sie in verschiedenen databaseen erstellen zu können, die KÖNNEN oder KANN NICHT sie bereits haben) und diese beiden hilfreichen Themen gefunden haben

  • SQL server: Überprüfen Sie, ob die Tabelle vorhanden ist
  • Überprüfen, ob Spalte in SQL server-Tabelle vorhanden ist

Also habe ich diese Abfrage gemacht

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 

Aber wenn ich es ausführen, habe ich das in der Fehlerliste.

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

Aber es schafft meinen Tisch sowieso ( ich habe ein "Select * von PERSON;" nach dem obigen Code, um zu überprüfen, ob der Fehler das nächste Skript blockieren kann oder nicht, und der Fehler blockiert es.

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

Es gibt einen path, es zu vermeiden? ). Und wenn ich diese Abfrage ausführen und die Tabelle schon existiere, bekam ich die folgenden Fehler.

 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. 

Wie könnte ich das erreichen, ohne diese Fehler zu bekommen? Gibt es eine Möglichkeit, dass ich mehrere Code wie diese ohne Probleme erstellen kann? Was mache ich falsch?

GO ähnelt dem Ende eines Skripts; Du kannst die GO aus deiner BEGIN-END-statement entfernen.

Wenn Sie unbedingt in den Code haben müssen, können Sie Ihre Abfrage als:

 IF (criteria) BEGIN ... END GO IF (newcriteria) BEGIN ... END ... IF (criteria) BEGIN ... END GO IF (newcriteria) BEGIN ... END ... IF (criteria) BEGIN ... END GO IF (newcriteria) BEGIN ... END 

Wo ich arbeite, müssen alle Skripte diese Prüfung haben. Ich habe alle Einstellungen vor dem Check wie so in diesem Beispiel:

 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 ( 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