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

执行上述查询时出现错误消息。请告诉我您是否有解决此问题的想法。

消息 102,级别 15,状态 1,第 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);
4

5 回答 5

27

GO实际上是无效的 T-SQL

GO 不是 Transact-SQL 语句;它是 sqlcmd 和 osql 实用程序以及 SQL Server Management Studio 代码编辑器识别的命令。

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

于 2013-01-23T05:52:56.697 回答
11

这是可能的,而且非常简单。

我想这里的每个人都被“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)
于 2013-03-14T09:34:24.033 回答
5

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

由于您不想运行单独的 SQL 查询,如问题的第二部分所述,您可能会自己将查询拆分为单独的批次。

您可以使用 UDF拆分查询GO。拆分后,执行分开的批次。

但是感觉不自然,首先在其中创建一个字符串,GO然后在几分钟后将其分开。

于 2013-01-23T06:11:15.407 回答
3

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

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

拉吉

于 2013-01-23T06:30:23.657 回答
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 )

此代码将生成一个我需要复制和运行而不是能够执行的选择语句表

EXEC(@sqlCommand)

这在“10000”错误附近给出了不正确的语法。

于 2013-09-25T14:41:41.930 回答