ADO.NETを介して1つのコマンド内で次のSQLを実行するには(単一実行)、どうすればよいですか?
ALTER TABLE [MyTable]
ADD NewCol INT
GO
UPDATE [MyTable]
SET [NewCol] = 1
バッチセパレーターGO
はサポートされていないため、2番目のステートメントは失敗します。
複数のcommand
実行を使用する以外に、これに対する解決策はありますか?
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
キーワードを理解しません。したがって、同等のものが必要な場合は、バッチを個別に分離して実行する必要があります。
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 を使用できるようです。ここに記事があります:
私のクエリがSSRSで機能しなかった理由を特定しようとして、これに遭遇しました。 SSRSではGO
を使用せず、代わりに異なるステートメントの間にセミコロンを使用します。
これは、設定でバッチセパレータが変更された場合にも発生する可能性があります。 SSMSで[ツール]-> [オプション]をクリックし、[クエリ実行]/[SQLサーバー]/[全般]に移動して、そのバッチ区切り文字を確認します。
CR LF行末。スクリプトを閉じて再度開くと、修正を促すメッセージが表示されます。
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