SqlException:'GO'附近的语法错误

时间:2012-02-15 03:04:13

标签: sql-server-2008 dbcontext

我无法使用context.Database.ExecuteSqlCommand()通过DbContext发送SQL语句。

我正在尝试执行

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的问题。我不知道这会如何适用于此。

3 个答案:

答案 0 :(得分:33)

GO不是SQL的一部分,因此无法使用ExecuteSqlCommand()执行。将GO视为在使用Management Studio或命令行工具时分离批次的一种方法。相反,只需删除GO语句,你应该没事。如果由于需要在不同的批次中运行命令而遇到错误,只需为要运行的每个批次调用一次ExecuteSqlCommand()。

答案 1 :(得分:4)

戴夫马克尔打败了我。实际上,您可以将“GO”更改为any other string以分隔批次。

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

答案 2 :(得分:1)

我知道,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();

在这种情况下,您的命令将被分割并执行而不会出现问题