2012-02-15 20 views
13

context.Database.ExecuteSqlCommand()を使用してDbContextを通じてSQL文を送信する際に問題が発生しました。SqlException: 'GO'の近くの構文エラー

私は、これはしかし、SSMSの正確な文がエラーなしで実行されることを実行しているエラー文字列

Incorrect syntax near the keyword 'ALTER'. 
Incorrect syntax near '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 

実行しようとしていますか? DbContextを介してデフォルトの制約について解決する必要がある問題。私は、制約を使用し、IsDbGeneratedがtrueに設定されていない人々に問題があることを確認しました。私はそれがここにどのように適用されるかわからない。

答えて

27

GOはSQLの一部ではないため、ExecuteSqlCommand()では実行できません。 GOは、Management Studioまたはコマンドラインツールを使用してバッチを区切る方法と考えてください。代わりに、単にGOステートメントを削除しても問題ありません。異なるバッチでコマンドを実行する必要があるためにエラーが発生した場合は、実行するバッチごとにExecuteSqlCommand()を1回だけ呼び出します。

4

デイブ・マークルは私にそれを打つ。実際には、 "GO"をany other stringに変更してバッチを分割することができます。

ここでの代替実装は、Entity FrameworkではなくSMOを使用することです。あなたの人生をもっと簡単にする便利な方法があります。ExecuteNonQueryと言います。 Hereは良い実装例です。

+0

ですSSMSの場合はtrueですが、SSMSのバッチ区切り記号を変更しても、上のコードは 'GO'でチョークします。 –

+0

私が追加したい1つの注意。私のような場合は、SMO経由で渡す問合せから何らかの戻り値が必要な場合は、ExecuteWithResultsがGOおよびALTER文を実行するときに例外を戻すことに注意してください。私はこれを少し前に見つけて、スクリプト実行時にチェックされるUIでExecuteNonQueryにオプションを追加するだけでした。 – CodeWarrior

0

私は知っている、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(); 

を動作させるために少しの回避策を作成することができます

関連する問題