- PR -

SQLServer2000のBCPユーティリティのストアド内IF文が無効になる

投稿者投稿内容
檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 2005-05-16 15:22
ストアド内にIF文が2つ以上あると失敗するようです。
うーん><;;
檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 2005-05-16 17:12
ストアド内の処理順序を適当に変えると動くこともあるようです(T−T
該当処理のロジックをいじってみます。。。
檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 2005-05-16 17:52
処理ロジックを適当に変えたらできました。
WHERE句を先に作成して変数に退避するようにしました。
失敗するケースについては良くわかりませんが、バグかと思っています。
お騒がせして、申し訳ありませんでした。
水谷
会議室デビュー日: 2004/05/07
投稿数: 17
お住まい・勤務地: 福島県
投稿日時: 2005-05-17 08:39
既に解決されているようですが、とりあえずこちらでも試してみました。

最初に確認したいのですが、現象としては
「IF文内のコードが必ず実行されてしまう」ではなく
「IF分内のコードがエラーであると表示されてしまう」ですか?

もしそうだとすると、IFブロックの中の文は実際に実行されるかされないかに
関わらず構文チェックが行われるようですので、今回の問題は単に構文エラーであると
いうことになると思います。

そういう前提でお聞きしますが、noderaさんが書かれているように
「"'"」(ダブル シングル ダブル)→「''''」(シングル×4)
という置き換えをしても本当にエラーが出ますか?
こちらで試した限りでは、エラー無く処理されました。

で、全然関係ないのですが、最初のIFブロックと2番目のIFブロックで
全く同じ WHERE句を生成しているほうが気になったりして(^^;
檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 2005-05-17 09:50
現象としては、
IF文内のコードが必ず実行されてしまうため、
(WHERE句が2つになり)IF分内のコードがエラーであると表示されてしまうです。

「"'"」(ダブル シングル ダブル)→「''''」(シングル×4)
の変更をしてもエラーはでてしまいました。
環境の違いかもしれません。

檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 2005-05-17 10:04
すいません、現象についてもう少し細かく書くと、
IF文内のコードが必ず実行されてしまうため、
(WHERE句が2つになり)(SQL文実行時に)IF分内のコードがエラーであると表示されてしまうです。

自分でもいろいろ試したのですが、
同じ制御文の並びでも変数内容等が違うとうまくいくように思えます。
このストアド(とこの環境?)に限っているようです><
水谷
会議室デビュー日: 2004/05/07
投稿数: 17
お住まい・勤務地: 福島県
投稿日時: 2005-05-17 12:10
プロファイラ等で調べてみたのですが、どうやら件のコマンドを実行すると
次のような流れで処理が行われるようです。

1.SET FMTONLY ON
2.EXEC TELSAS_BASE.dbo.エラーログ詳細情報エクスポート @DBNAME_M='TELSAS200504',@DBNAME_B='TELSAS_BASE',@TERMNO='ffff',@TANSHU='30',@KAISHU='03' を実行
3.SET FMTONLY OFF
4.EXEC TELSAS_BASE.dbo.エラーログ詳細情報エクスポート @DBNAME_M='TELSAS200504',@DBNAME_B='TELSAS_BASE',@TERMNO='ffff',@TANSHU='30',@KAISHU='03' を実行

2 のプロシージャ実行で、出力するデータのフォーマットを取得し、
4 のプロシージャ実行で、実際のデータ出力が行われています。

今回エラーが発生しているのが 2 のプロシージャ実行時で、
あおいさんが書かれている通り、IF の条件が一切評価されずに全て実行されているようです。

それで、いろいろ回避策を探してみたのですが、以下のようにしてみるとうまくいくような気がします…。

コード:
SELECT
    @strSQL = @strSQL
        + CASE
              WHEN 'A' = 'B'  THEN
                  ' Where m.端末種別コード = ' + "'" + @TANSHU + "'" + ' and ' + 'm.会社コード=' + "'" + @KAISHU + "'" + ' and ' + 's.ログ種別=' + "'" + '1' + "'" 
              WHEN @TERMNO = 'ffff' AND @TANSHU != 'ff' AND @KAISHU != 'ff' THEN
                  ' Where m.端末種別コード = ' + "'" + @TANSHU + "'" + ' and ' + 'm.会社コード=' + "'" + @KAISHU + "'" + ' and ' + 's.ログ種別=' + "'" + '1' + "'" 
          END


檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 2005-05-17 13:10
回避策までどうもありがとうございます。

自分もプロファイラで見てみましたが、SQL文の実行が成功しないとSQL文が表示されないのでよくわかりませんでした。

回避策で成功できるかやってみます。。。

スキルアップ/キャリアアップ(JOB@IT)