【问题标题】:Incorrect syntax near 'GO''GO' 附近的语法不正确
【发布时间】:2014-09-05 07:36:22
【问题描述】:

如何通过 ADO.NET 在单个命令(单次执行)中执行以下 SQL?

ALTER TABLE [MyTable]
    ADD NewCol INT

GO

UPDATE [MyTable] 
    SET [NewCol] = 1

不支持批处理分隔符GO,如果没有它,第二条语句将失败。

除了使用多个command 执行之外,还有其他解决方案吗?

【问题讨论】:

  • 为什么要通过 ASP.NET 添加列?这是否意味着您将无限期地添加列?
  • 通过更新机制部署数据库更改?
  • 你的 SQL 版本是多少?

标签: sql-server ado.net


【解决方案1】:

GO 关键字不是 T-SQL,而是一个 SQL Server Management Studio 工件,它允许您将一个脚本文件的执行分离为多个批次。即当您在 SSMS 中运行 T-SQL 脚本文件时,语句将分批运行,由 GO 关键字分隔。更多细节可以在这里找到:https://msdn.microsoft.com/en-us/library/ms188037.aspx

如果你读到了,你会发现 sqlcmd 和 osql 也支持GO

SQL Server 不理解 GO 关键字。因此,如果您需要一个等价物,您需要自己分开并单独运行批次。

【讨论】:

  • 感谢您的解释。在执行命令之前,我使用这个正则表达式来摆脱 GO 语句。模式 = @"(?:\s|\r?\n)+GO(?:\s|\r?\n)+"
【解决方案2】:

删除GO:

String sql = "ALTER TABLE  [MyTable] ADD NewCol INT;";
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
sql = "UPDATE [MyTable] SET [NewCol] = 1";
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();

您似乎可以为此使用Server class。这是一篇文章:

C#: Executing batch T-SQL Scripts containing GO statements

【讨论】:

  • 很好的答案!我想它支持所有其他 SQLCMD 模式指令。
【解决方案3】:

当您在设置中更改了批次分隔符时,也会发生这种情况。在 SSMS 中单击工具 --> 选项并转到查询执行/SQL Server/常规以检查该批处理分隔符。

我刚刚因为没有 CR LF 行结尾的脚本而失败了。关闭并重新打开脚本似乎会提示修复。只是另一件事要检查!

【讨论】:

    【解决方案4】:

    在 SSMS(SQL Server 管理系统)中,您可以在任何查询后运行 GO,但有一个问题。分号和 GO 不能在同一行。去图吧。

    这行得通:

    SELECT 'This Works';
    GO
    

    这也有效:

    SELECT 'This Too'
    ;
    GO
    

    但这不是:

    SELECT 'This Doesn''t Work'
    ;GO
    

    【讨论】:

      【解决方案5】:

      在试图确定为什么我的查询在 SSRS 中不起作用时遇到了这个问题。您不要在 SSRS 中使用 GO,而是在不同语句之间使用分号。

      【讨论】:

        【解决方案6】:

        如果您使用了 IF 语句并错误地关闭了它们,也会出现此错误。

        请记住,如果您的 IF 语句超过一行,则必须使用 BEGIN/END。

        这行得通:

        IF @@ROWCOUNT = 0
        PRINT 'Row count is zero.'
        

        但如果你有两行,它应该是这样的:

        IF @@ROWCOUNT = 0
        BEGIN
        PRINT 'Row count is zero.'
        PRINT 'You should probably do something about that.'
        END
        

        【讨论】:

          【解决方案7】:

          我在GO 之后放置了一个分号;,这是我出错的原因。

          【讨论】:

            【解决方案8】:

            当我在同一行中的 sql 查询之后放置“GO”关键字时收到此错误消息,如下所示:

            insert into fruits (Name) values ('Apple'); GO
            

            将其写在两个单独的行中运行。也许这会对某人有所帮助......

            【讨论】:

              【解决方案9】:

              我首先尝试通过对 (?:\s|\r?\n)+GO(?:\s|\r?\n)+ 正则表达式进行模式匹配来删除 GO 语句,但发现我们的 SQL 脚本存在更多与 SQL 命令执行不兼容的问题。

              不过,感谢@tim-schmelter answer,我最终使用了Microsoft.SqlServer.SqlManagementObjects 包。

              string sqlText;
              string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=FOO;Integrated Security=True;";
              var sqlConnection = new System.Data.SqlClient.SqlConnection(connectionString);
              var serverConnection = new Microsoft.SqlServer.Management.Common.ServerConnection(sqlConnection);
              var server = new Microsoft.SqlServer.Management.Smo.Server(serverConnection);
              
              int result = server.ConnectionContext.ExecuteNonQuery(sqlText);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-09-23
                • 2011-08-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多