Выполнение динамического запроса с помощью sql

DECLARE @script VARCHAR(MAX);
SET @script = 
    '
    create table ali(id decimal(10,0));
    drop table ali;
    go
    create table ali(id decimal(10,0));
    drop table ali;
    '

EXEC (@script);

При выполнении запроса выше возникло сообщение об ошибке. Скажите, пожалуйста, если у вас есть идея решить эту проблему.

Msg 102, Level 15, State 1, Line 4 Неверный синтаксис рядом с "go".

Примечание: приведенный выше код для создания и удаления созданной таблицы является, например, У меня есть другие динамические запросы с инструкцией go. Пожалуйста, не давайте ответа.

DECLARE @script   VARCHAR(MAX),
        @script1  VARCHAR(MAX);
SET @script = 
    '
    create table ali(id decimal(10,0));
    drop table ali;
    ';
SET @script1 = 
    '
    create table ali(id decimal(10,0));
    drop table ali;
    ';
EXEC (@script);
EXEC (@script1);

Ответ 1

GO на самом деле недействительный T-SQL:

GO не является оператором Transact-SQL; это команда, признанная sqlcmd и утилиты osql и код SQL Server Management Studio редактор.

Вам придется удалить экземпляры GO в динамическом SQL или использовать один из инструментов, упомянутых в статье (например, osql из командной строки). Ваш запрос должен по-прежнему работать со всеми экземплярами GO, удаленными из динамического SQL.

Ответ 2

Это возможно и очень просто сделать.

Я думаю, что все здесь просто повесились по ключевому слову "GO".

Решение:

--Your Script modified by adding a single line of code:
DECLARE @script nVarChar(MAX);--I changed from VarChar to nVarChar - you should always use nVarChar for Dynamic SQL.
SET @script = 
    '
    create table ali(id decimal(10,0));
    drop table ali;
    go
    create table ali(id decimal(10,0));
    drop table ali;
    '
    --In case you have apostrophes in your script, you must escape them for the Exec() command. - 03/14/2013 - MCR.
SET @script = 'EXEC (''' + REPLACE(REPLACE(@script, '''', ''''''), 'GO', '''); EXEC(''') + ''');'--Just add this one line.
PRINT @script --See the command used (will be truncated in Select/Print, but not when Executing).
EXEC (@script);


Для тех, кто ищет решение, в котором вы динамически объединяете несколько операторов из таблицы:

--Example of compiling and chaining multiple DDL statments from data in a table:
-- DDL (Data Definition Language).
--  These are statements used to create, alter, or drop data structures.
--  They MUST be run in a single Batch.
--  The "GO" keyword is a SSMS syntax for splitting up batches - it is not an SQL keyword.
DECLARE @DDL_Statements TABLE
(
  DDL nVarChar(MAX)
)
INSERT INTO @DDL_Statements (DDL)
    SELECT 'create table ali(id decimal(10,0)); drop table ali;' UNION ALL
    SELECT 'create table ali(id decimal(10,0)); drop table ali;'
DECLARE @SqlCommand nVarChar(MAX) = ''
 SELECT @SqlCommand = @SqlCommand + 'EXEC(''' + REPLACE(DS.DDL, '''', '''''') + '''); '
   FROM @DDL_Statements as DS --In case you have apostrophes in your script, you must escape them for the Exec() command. - 03/14/2013 - MCR.
PRINT @SqlCommand --See the command used (will be truncated in Select/Print, but not when Executing).
EXEC (@SqlCommand)

Ответ 3

Вы просто не можете использовать GO в динамическом T-SQL-запросе, как указано @mellamokb.

Поскольку вы не хотите запускать отдельные SQL-запросы, как указано во второй части вашего вопроса, вы можете уйти, разбив запрос на отдельные партии самостоятельно.

Вы можете разделить запрос на GO с помощью UDF. После разделения выполните отдельные партии.

Но это не кажется естественным, сначала создать в нем строку с GO, а затем разбить ее на несколько секунд позже.

Ответ 4

GO - это серийный разделитель, и, как указано другими, недействителен SQL. По сути, вы можете перейти в SSMS - Tools - Options - Query Execution - SQL Server и ввести другой текст, например COME, который будет использоваться в качестве вашего разделителя пакетов.

Если вы сделаете это, GO не будет распознан даже в SSMS. Динамический SQL должен работать даже без сеточного устройства. Я не вижу необходимости здесь GO

Раджа

Ответ 5

Пример того, когда вы хотите использовать GO в динамическом SQL, будет Мне нужно заполнить несколько таблиц данными и вы хотите использовать GO n с n, представляющим количество времени, которое я хочу запустить.

        DECLARE @statement TABLE
        (
          SqlCommand NVARCHAR(MAX)
        )

DECLARE @sqlCommand NVARCHAR(MAX) = 'INSERT INTO [dbo].[tbl_table1] ([Field1],[Field2],[Field3],[Field4],[Field5],[Field6],[Field7],[Field8],[Field9],[Field10],[Field11])SELECT ''a'',''b'',''c'',''d'',''e'',''f'',''g'',''h'',''i'',''j'',RAND(),RAND(),RAND()
GO 10000'
INSERT  INTO @statement
            ( SqlCommand )
    VALUES  ( @sqlCommand )
    SET @sqlCommand = REPLACE(@sqlCommand, '[tbl_table1]', '[tbl_table2]')
    INSERT  INTO @statement
            ( SqlCommand )
    VALUES  ( @sqlCommand )

Этот код будет работать, создавая таблицу операторов select, которые мне нужно скопировать и запустить вместо того, чтобы делать

EXEC(@sqlCommand)

Что дает неправильный синтаксис около ошибки "10000".