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是一个很好的实现示例。
答
我知道,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();
在这种情况下,您的命令将被分裂,没有问题执行
这是对于SSMS是正确的,但是即使你改变了SSMS中的批处理分隔符,上面的代码仍然会扼杀“GO”。 – 2012-02-15 05:00:25
我想补充一点。如果像我一样,通常需要通过SMO传递的查询的某种返回值,请注意,ExecuteWithResults在运行到GO和ALTER语句时将返回异常。前一段时间我发现了这一点,最后只是在我们的用户界面上提供了一个ExecuteNonQuery选项,并在脚本运行时进行检查。 – CodeWarrior 2013-05-29 15:01:50