ブロッコリーを克服するまでプログラミング

プログラミングとか趣味とかを報告します。

SQLServer : エラーが出ていないのにストアドプロシージャの処理が止まっている?

スレッド内でSQLServerのストアドプロシージャを SQLExecDirect / SQLExecute で実行するサービスプログラムを作成した。だがしかし、なぜかストアドプロシージャの実行がうまくいっていないようであった。

ストアドプロシージャはデータの集計 + INSERTしか行っておらず、SQLServer Management Studio上で当該のストアドプロシージャを実行しても、エラーが一切確認できなかった。

 

ログやイベントビューアーなどから始まり、怪しい行を消したりCURSORをいじったり、SQLSetStmtAttrをいじったり、早3時間・・・。いろいろ行って分かったのは、「CURSORループ内でINSERTを使用すると止まる」ということであった。

 

INSERT特有といえば、Management Studio上でINSERT構文を実行すると以下のメッセージが現れることくらいである。

 

f:id:atwtama:20180418214134p:plain

 

これやろ!!!!!なんとなくやけどこの(1行処理されました)という処理行数メッセージ!!!Management Studio上では自然におるけど、絶対に悪い奴やろ!!!とりあえず、ストアドプロシージャ内に「SET NO COUNT ON」を記述すれば消えます。この1行を追加するだけで、(1行処理されました)と出力されていた状態から、以下のように「コマンドは正常に完了しました。」という文字列に変わりました。

 

f:id:atwtama:20180418214407p:plain

 

まじで、これだけで、正常にサービスからストアドプロシージャが実行されるようになりました。めでたしめでたし。

 

 

 

その後、突然のデジャブから、一年前に作成した同様の処理を行うストアドプロシージャを確認すると、SET NO COUNT ONが記述されていた。つまり、私は当該問題に一度ぶちあたり、解決していたのにもかかわらず、忘れていたのである。

 

なので、備忘録としてここに記す。