SqlException:在“GO”附近出现语法错误

问题描述:

我在使用context.Database.ExecuteSqlCommand()通过DbContext发送SQL语句时遇到问题。SqlException:在“GO”附近出现语法错误

我试图执行

CREATE TABLE Phones([Id] [uniqueidentifier] NOT NULL PRIMARY KEY, 
    [Number] [int],[PhoneTypeId] [int]) 
GO 
ALTER TABLE [dbo].[Phones] ADD CONSTRAINT [DF_Phones_Id] 
    DEFAULT (newid()) FOR [Id] 
GO 

这失败,出现错误字符串

Incorrect syntax near the keyword 'ALTER'. 
Incorrect syntax near 'GO'. 

但是运行在SSMS确切的说法没有错误运行?我需要通过DbContext解决有关默认约束的任何问题。我看到使用约束的人员的问题,而不是将IsDbGenerated设置为true。我不确定这将如何适用于此。

GO不是SQL的一部分,所以它不能用ExecuteSqlCommand()来执行。使用管理工作室或命令行工具时,将GO视为分离批次的一种方式。相反,只是删除GO语句,你应该没问题。如果由于需要分批运行命令而遇到错误,只需为每个要运行的批次调用ExecuteSqlCommand()一次。

Dave Markle打败了我。实际上,您可以将“GO”更改为any other string以分开批次。

这里的一个替代实现是使用SMO而不是实体框架。有一种有用的方法叫做ExecuteNonQuery,我认为它会让你的生活变得更简单。 Here是一个很好的实现示例。

+0

这是对于SSMS是正确的,但是即使你改变了SSMS中的批处理分隔符,上面的代码仍然会扼杀“GO”。 – 2012-02-15 05:00:25

+0

我想补充一点。如果像我一样,通常需要通过SMO传递的查询的某种返回值,请注意,ExecuteWithResults在运行到GO和ALTER语句时将返回异常。前一段时间我发现了这一点,最后只是在我们的用户界面上提供了一个ExecuteNonQuery选项,并在脚本运行时进行检查。 – CodeWarrior 2013-05-29 15:01:50

我知道,necroposting是不好的,但可能是这篇文章会节省一些人的时间。因为它是在Dave的文章中提到,GO并不是SQL的组成部分,所以我们可以创建小的解决办法,使工作

  var text = System.IO.File.ReadAllText("initialization.sql"); 
      var parts = text.Split(new string[] { "GO" }, System.StringSplitOptions.None); 
      foreach (var part in parts) { context.Database.ExecuteSqlCommand(part); } 

      context.SaveChanges(); 

在这种情况下,您的命令将被分裂,没有问题执行