SQLは全く得意ではありません。 コンサルタントが書いた次のようなコードがあります。
まず、小学校のみが選択されていることを確認し、BEGINの後、変数@Termが3となった場合、IF文の下の処理を行いたいと思います。 ここで問題が発生します。 Termが=3ではないとき、私たちはまだ、@ClassesへのSECOND INSERT INTOの部分を行いたいのです。 参考までに、これが実行されているとき、Termは=3ですが、両方のINSERT'sを実行していません。
IF @SchoolCategoryCode = 'Elem'
--- We now have determined we are processing an elementary school...
BEGIN
---- Only do the following if the variable @Term equals a 3 - if it does not, skip just this first part
IF @Term = 3
BEGIN
INSERT INTO @Classes
SELECT
XXXXXX
FROM XXXX blah blah blah
END <----(Should this be ENDIF?)
---- **always** "fall thru" to here, no matter what @Term is equal to - always do the following INSERT for all elementary schools
INSERT INTO @Classes
SELECT
XXXXXXXX
FROM XXXXXX (more code)
END
これがMS SQL Serverであれば、あなたが持っているものは問題なく動作するはずです...。 実際、技術的にはBegin & Endは全く必要ありません。なぜならbegin-Endブロックには1つのステートメントしかないからです。 (@Classesはテーブル変数だと思うのですが?)
If @Term = 3
INSERT INTO @Classes
SELECT XXXXXX
FROM XXXX blah blah blah
-- -----------------------------
-- This next should always run, if the first code did not throw an exception...
INSERT INTO @Classes
SELECT XXXXXXXX
FROM XXXXXX (more code)
あなたがやりたいことの説明によると、コードはそのままで正しいようです。 ENDIFは有効なSQLループ制御キーワードではありません。 INSERTSが実際にデータを取り出して@Classesに入れているのは確かですか? 実際、それが悪ければ実行されないだけです。
試してみたいのは、PRINT文をいくつか入れてみることです。 各INSERTSの上にPRINTを置き、その行が実行されていることを示すために、何かくだらないテキストを出力します。 もし両方の出力が得られれば、あなたのSELECT...INSERT...は疑わしいです。 PRINTの代わりにSELECTを実行して(つまりINSERTなしで)、どのようなデータが引き出されているかを正確に確認することもできます。