使用go in sql执行动态查询

时间:2013-01-23 05:44:19

标签: sql sql-server sql-server-2008

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);

5 个答案:

答案 0 :(得分:20)

GO实际上是not valid T-SQL

  

GO不是Transact-SQL语句;这是一个被公认的命令   sqlcmd和osql实用程序以及SQL Server Management Studio代码   编辑器。

您必须在动态SQL中删除GO的实例,或者使用文章中提到的工具之一(例如命令行中的osql)。您的查询仍应适用于从动态SQL中删除的GO的所有实例。

答案 1 :(得分:9)

这是可行且非常简单的。

我认为这里的每个人都挂了“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)

答案 2 :(得分:5)

您无法在动态T-SQL查询中使用GO,如@mellamokb所述。

由于您不想运行单独的SQL查询,如问题的第二部分所述,您可能会自行分开查询分离查询。

你可以split the query on GO using a UDF。拆分后,执行分离的批次。

但首先在其中创建一个包含GO的字符串,然后片刻之后将其拆分,感觉并不自然。

答案 3 :(得分:3)

GO是一个批处理分隔符,正如其他人所指出的那样,它不是有效的SQL。事实上,您可以转到SSMS - 工具 - 选项 - 查询执行 - SQL Server并输入一些其他文本,例如COME用作批处理分隔符。

如果你这样做,即使在SSMS中也不会识别GO。即使没有批处理分隔符,您也应该运行动态SQL。我不认为这里需要GO

拉​​吉

答案 4 :(得分:1)

您希望在动态SQL中使用GO的示例 我需要用数据填充几个表,并希望使用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”错误附近给出了错误的语法。