C# を使用して SQL クエリを生成する際に問題が発生しています。トラブルシューティングのために、クエリを実行するボタンにクエリ テキストをフォームのテキスト ボックスにも表示するようにしました。困惑しているのは、プログラムがクエリを実行しようとすると、「'IF' 付近の構文が正しくありません」というエラーが表示されることですが、クエリをテキスト ボックスから SSMS にコピー/貼り付けすると、正常に動作します。
クエリを格納する変数は次のようになります。
string myQuery = @"
SELECT DISTINCT filter.id_column INTO #temp1
FROM MasterDB.dbo.filter filter
LEFT JOIN ClientDB.dbo.codes codetable
ON filter.id_column=codetable.id_column
WHERE codetable.name IS NULL
DECLARE @code_id1 INT;
SET @code_id1 = (SELECT MAX(code_num) FROM ClientDB.dbo.codes)+1
EXEC('ALTER TABLE #temp1 ADD tempID INT IDENTITY(' + @code_id1 + ',1)')
GO
IF (SELECT COUNT(*) FROM #temp1)>0
BEGIN
DECLARE @code_id2 INT;
SET @code_id2 = (SELECT MAX(tempID) FROM #temp1)+1
UPDATE ClientDB.dbo.track
SET next=@code_id2 WHERE [trackname]='account'
END";
テキスト ボックスにクエリ テキストを入力し、クエリを実行する C# コードは次のようになります。
using (SqlConnection myConnection = new SqlConnection(HostConnStr))
using (SqlCommand myCommand = myConnection.CreateCommand())
{
myCommand.CommandText = myQuery;
this.textBox1.Text = myCommand.CommandText;
myConnection.Open();
try { myCommand.ExecuteNonQuery(); }
catch (SqlException s) { MessageBox.Show(s.ToString()); }
myConnection.Close();
}
クエリ テキストを SSMS にコピーして正常に実行できるのに、C# から実行すると SQL 例外がスローされる理由を知っている人はいますか? また、クエリを実行するにはどうすればよいですか?
クエリの設計に関する批判は歓迎されますが、クエリをそのまま実行する必要があるため、単にクエリを実行することに関心があります。
編集:これは重複している可能性があります(「GO」が問題であると思われるときに「IF」の近くにあるというエラーに悩まされたため、検索が間違った方向に進んでいました。ただし、答えが正しいかどうかはまだわかりません同様の質問で提供されたものは機能します。クエリを複数のコマンドに分割すると、クエリの後半部分が前の部分の一時テーブルを参照するために失敗するという印象を受けているからです (最初のコマンドが実行された後、一時テーブルは使用できなくなりますか?終了した?)。