Выполнение динамического запроса с помощью 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".