web-dev-qa-db-ja.com

「GO」付近の構文が正しくありません

ADO.NETを介して1つのコマンド内で次のSQLを実行するには(単一実行)、どうすればよいですか?

ALTER TABLE [MyTable]
    ADD NewCol INT

GO

UPDATE [MyTable] 
    SET [NewCol] = 1

バッチセパレーターGOはサポートされていないため、2番目のステートメントは失敗します。

複数のcommand実行を使用する以外に、これに対する解決策はありますか?

37
Andrew Bullock

GOキーワードはT-SQLではなく、スクリプトファイルの実行を複数のバッチに分けることができるSQL Server Management Studioアーティファクトです。 SSMSでT-SQLスクリプトファイルを実行すると、ステートメントはGOキーワードで区切られたバッチで実行されます。詳細はこちらをご覧ください: https://msdn.Microsoft.com/en-us/library/ms188037.aspx

これを読むと、sqlcmdとosqlがGOもサポートしていることがわかります。

SQL ServerはGOキーワードを理解しません。したがって、同等のものが必要な場合は、バッチを個別に分離して実行する必要があります。

60
JotaBe

GOを削除します。

String sql = "ALTER TABLE  [MyTable] ADD NewCol INT;";
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
sql = "UPDATE [MyTable] SET [NewCol] = 1";
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();

そのために Server class を使用できるようです。ここに記事があります:

C#:GOステートメントを含むバッチT-SQLスクリプトの実行

17
Tim Schmelter

私のクエリがSSRSで機能しなかった理由を特定しようとして、これに遭遇しました。 SSRSではGOを使用せず、代わりに異なるステートメントの間にセミコロンを使用します。

2
Vistance

これは、設定でバッチセパレータが変更された場合にも発生する可能性があります。 SSMSで[ツール]-> [オプション]をクリックし、[クエリ実行]/[SQLサーバー]/[全般]に移動して、そのバッチ区切り文字を確認します。

CR LF行末。スクリプトを閉じて再度開くと、修正を促すメッセージが表示されます。

2
Gamic

IFステートメントを使用して誤って閉じた場合にも、このエラーが発生します。

IFステートメントが1行より長い場合は、BEGIN/ENDを使用する必要があることに注意してください。

これは動作します:

IF @@ROWCOUNT = 0
PRINT 'Row count is zero.'

ただし、2行ある場合は、次のようになります。

IF @@ROWCOUNT = 0
BEGIN
PRINT 'Row count is zero.'
PRINT 'You should probably do something about that.'
END
2
David Wilson