SqlException: синтаксическая ошибка рядом с GO - PullRequest
15 голосов
/ 15 февраля 2012

У меня проблемы с отправкой оператора SQL через DbContext с использованием context.Database.ExecuteSqlCommand().

Я пытаюсь выполнить

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 ]

33 голосов
/ 15 февраля 2012

GO не является частью SQL, поэтому его нельзя выполнить с помощью ExecuteSqlCommand ().Думайте о GO как о способе разделения пакетов при использовании Management Studio или инструментов командной строки.Вместо этого просто удалите операторы GO, и все будет в порядке.Если вы столкнулись с ошибками, потому что вам нужно запускать команды в отдельных пакетах, просто вызовите ExecuteSqlCommand () один раз для каждого пакета, который вы хотите запустить.

4 голосов
/ 15 февраля 2012

Дэйв Маркл победил меня в этом.Фактически, вы можете изменить «GO» на любую другую строку для разделения пакетов.

Альтернативная реализация здесь - использовать SMO вместо Entity Framework.Там есть полезный метод под названием ExecuteNonQuery , который, я думаю, сделает вашу жизнь намного проще. Здесь - хороший пример реализации.

1 голос
/ 09 августа 2017

Я знаю, некропостинг - плохая манера, но, возможно, этот пост сэкономит кому-то время.Как было упомянуто в посте Дэйва, 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();

В этом случае ваши команды будут разделены и выполнены без проблем

...