Можно ли выполнить оператор с многократным использованием «GO»? - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь выполнить пакет (как часть более крупного скрипта) на MS SQL Server, и он возвращает список ошибок:

Msg 156, Level 15, State 1, Line 32 Incorrect syntax near the keyword 'ALTER'. Msg 102, Level 15, State 1, Line 33 Incorrect syntax near 'GO'.

и т. Д.

Это пакет:

 IF NOT EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='ANS_247LIB_CIRCDESK_CONFIG_PROFILE')
 BEGIN


 DECLARE @SqlStr nvarchar(max)


 SET @SqlStr= ' 

CREATE TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE](
    [CONFIG_ID] [int] IDENTITY(1,1) NOT NULL,
    [SEARCH_BY_NAME] [nchar](1) NOT NULL,
    [SEARCH_BY_BARCODE] [nchar](1) NOT NULL,
    [SEARCH_BY_DOB] [nchar](1) NOT NULL,
    [DISPLAY_USERID] [nchar](1) NOT NULL,
    [DISPLAY_CHARGES] [nchar](1) NOT NULL,
    [DISPLAY_RESERVATIONS] [nchar](1) NOT NULL,
    [DISPLAY_DOB] [nchar](1) NOT NULL,
    [DISPLAY_STATUS] [nchar](1) NOT NULL,
    [DISPLAY_GENDER] [nchar](1) NOT NULL,
    [DISPLAY_REFS] [nchar](1) NOT NULL,
    [DISPLAY_LIBRARY] [nchar](1) NOT NULL, 
    [DISPLAY_EMAIL] [nchar](1) NOT NULL,
    [DISPLAY_MOBILENO] [nchar](1) NOT NULL,
    [FOREGROUND_COLOUR] [nvarchar](10) NOT NULL,
    [BACKGROUND_COLOUR] [nvarchar](10) NOT NULL,
    [BUTTON_COLOR] [nvarchar](10) NOT NULL,
    [BOX_COLOR] [nvarchar](10) NOT NULL,
    [TEXT_COLOR] [nvarchar](10) NOT NULL,
    [PROFILE_ID] [int] NOT NULL,
 CONSTRAINT [ANS_247LIB_CIRCDESK_CONFIG_PROFILE_pk] PRIMARY KEY CLUSTERED 
(
    [CONFIG_ID] 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

ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__SEARC__292D09F3]  DEFAULT (''Y'') FOR [SEARCH_BY_NAME]
GO

ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__SEARC__2A212E2C]  DEFAULT (''Y'') FOR [SEARCH_BY_BARCODE]
GO                                                                                                          
ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__SEARC__2B155265]  DEFAULT (''Y'') FOR [SEARCH_BY_DOB]
GO                                                                                                          
ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__DISPL__2C09769E]  DEFAULT (''Y'') FOR [DISPLAY_USERID]
GO                                                                                                              
ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__DISPL__541767F8]  DEFAULT (''Y'') FOR [DISPLAY_CHARGES]
GO                                                                                                               
ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__DISPL__2CFD9AD7]  DEFAULT (''Y'') FOR [DISPLAY_DOB]
GO                                                                                                                
ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__DISPL__2DF1BF10]  DEFAULT (''Y'') FOR [DISPLAY_STATUS]
GO                                                                                                               
ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__DISPL__2EE5E349]  DEFAULT (''Y'') FOR [DISPLAY_GENDER]
GO                                                                                                               
ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__DISPL__2FDA0782]  DEFAULT (''Y'') FOR [DISPLAY_REFS]
GO                                                                                                               
ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__DISPL__30CE2BBB]  DEFAULT (''Y'') FOR [DISPLAY_LIBRARY]
GO                                                                                                                
ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__DISPL__31C24FF4]  DEFAULT (''Y'') FOR [DISPLAY_EMAIL]
GO                                                                                                                
ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__DISPL__32B6742D]  DEFAULT (''Y'') FOR [DISPLAY_MOBILENO]
GO

ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__FOREG__33AA9866]  DEFAULT (''#E0F7F7'') FOR [FOREGROUND_COLOUR]
GO

ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF__ANS_247LI__BACKG__349EBC9F]  DEFAULT (''#00BCD4'') FOR [BACKGROUND_COLOUR]
GO

ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF_ANS_247LIB_CIRCDESK_CONFIG_PROFILE_BUTTON_COLOR]  DEFAULT (''#00BCD4'') FOR [BUTTON_COLOR]
GO

ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF_ANS_247LIB_CIRCDESK_CONFIG_PROFILE_BOX_COLOR]  DEFAULT (''#00BCD4'') FOR [BOX_COLOR]
GO

ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] ADD  CONSTRAINT [DF_ANS_247LIB_CIRCDESK_CONFIG_PROFILE_TEXT_COLOR]  DEFAULT (''#FFFFFF'') FOR [TEXT_COLOR]
GO

ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE]  WITH CHECK ADD  CONSTRAINT [ANS_247LIB_CIRCDESK_CONFIG_PROFILE_ANS_PROFILE_PROFILE_ID_fk] FOREIGN KEY([PROFILE_ID])
REFERENCES [dbo].[ANS_PROFILE] ([PROFILE_ID])
GO

ALTER TABLE [dbo].[ANS_247LIB_CIRCDESK_CONFIG_PROFILE] CHECK CONSTRAINT [ANS_247LIB_CIRCDESK_CONFIG_PROFILE_ANS_PROFILE_PROFILE_ID_fk]
GO
'
 EXEC (@SqlStr)

 END
 GO

Я знаю, что могу выполнять эти операторы по одному, но желательно, чтобы этот сценарий выполнялся все сразу, если это возможно.

Можно ли использовать несколько раз «GO» в строке при использовании EXEC?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Короче говоря, Go - это разделитель пакетов.

  1. Пакет - это группа из одного или нескольких операторов Transact-SQL, одновременно отправляемых из приложения в SQL Server для выполнения запроса иGO - это команда, которая сообщает системе, что это конец пакета.Это не оператор T-SQL.
  2. Вы должны использовать его только тогда, когда это необходимо.Поэтому вы должны иметь в виду, что наряду с определением пакета с помощью команды GO вы определяете область действия этого фрагмента кода T-SQL.

Вам придется удалять экземпляры GO в вашемдинамический SQL

0 голосов
/ 21 ноября 2018

Вы МОЖЕТЕ выполнить более одной statement в одной команде EXEC, но вы не можете использовать GO (разделитель пакетов) в пределах EXEC, поскольку он не является частью T-SQL:

SQL Server предоставляет команды, которые не являются операторами Transact-SQL, но распознаются утилитами sqlcmd и osql и редактором кода SQL Server Management Studio.Эти команды могут использоваться для облегчения чтения и выполнения пакетов и сценариев.

GO сигнализирует об окончании пакета операторов Transact-SQL для утилит SQL Server.

Заявления утилит SQL Server - GO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...