- - PR -
SQLServer2000のBCPユーティリティのストアド内IF文が無効になる
1|2|3
次のページへ»
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2005-05-13 17:34
<実行環境>
OS:Windows2003Server SP1 DB:SQLServer2000 SP4 上記の環境でSQLServer2000のBCPユーティリティ(bcp.exe)をコマンドプロンプトから実行したところ、BCPの引数で指定したストアドプロシージャ内のIF文の条件が有効にならず、IF文内のコードが必ず実行されてしまいました。 ●IF文の条件の間違いを考慮して単純な条件(IF 'A'='B')で実行してみましたが、やはり、IF文内のコードが必ず実行されてしまいます。 ●ストアド自体はクエリアナライザで正常に実行されます(BCPから実行した場合に限るようです)。 原因をご存知の方、 似たような現象に合われた方がいらっしゃいましたら、 解決方、アドバイスなど頂きたく、宜しくお願い致します。 |
|
投稿日時: 2005-05-13 20:20
水谷です。
bcp でストアドプロシージャの実行、ということをやったことがないのですが、 もし可能ならば bcp を実行したときのコマンドラインやストアドプロシージャの 内容等を教えて頂ければアドバイスしやすいかもしれません。 |
|
投稿日時: 2005-05-16 09:24
返答が遅れて、すいません。
以下にコマンドラインとストアドプロシージャを記載させて頂きます。 実行すると「Where句の付近が不正です。」になります。 (★そもそもBCPのストアドのIF文が有効にできた方がいるのかだけでも、教えて頂けると幸いです。) 【コマンドライン】 bcp.exe "EXEC TEL_BASE.dbo.エラーログ詳細情報エクスポート @DBNAME_M='AEL200504',@DBNAME_B='TEL_BASE',@TERMNO='ffff',@TANSHU='30',@KAISHU='03'" queryout "D:\CSV形式出力機能\結果ファイル\EXP.txt" -c -S "UKU\AEL" -U "sa" -P 【ストアドプロシージャ】 ALTER PROCEDURE [エラーログ詳細情報エクスポート] @DBNAME_M nvarchar(20), /* 月別DB名称 */ @DBNAME_B nvarchar(20), /* 基本DB名称 */ @TERMNO char(4), /* 端末番号 */ @TANSHU char(2), /* 端末種別コード */ @KAISHU char(2) /* 会社種別コード */ AS declare @strSQL nvarchar(1000) /* 共通SELECT文作成 */ set @strSQL = 'SELECT m.ターミナル番号,s.障害メッセージ,d.障害コード,d.発生時刻,d.発生モジュール,d.障害理由コード,d.モジュール別詳細情報 ' + 'FROM (' + @DBNAME_M + '..エラーログ詳細情報マスタ m inner join ' + @DBNAME_M + '..エラーログ詳細情報ディティール d on m.詳細情報生成ID=d.詳細情報生成ID) ' + ' inner join ' + @DBNAME_B + '..TEL障害コード s on s.障害コード=d.障害コード and m.端末種別コード=s.端末種別コード and m.業務種別コード=s.業務種別コード' /* where句作成: ターミナル番号指定の場合 */ --IF @TERMNO !='ffff' AND @TANSHU = 'ff' AND @KAISHU = 'ff' IF 'A' = 'B' BEGIN set @strSQL = @strSQL + ' Where m.端末種別コード = ' + "'" + @TANSHU + "'" + ' and ' + 'm.会社コード=' + "'" + @KAISHU + "'" + ' and ' + 's.ログ種別=' + "'" + '1' + "'" END /* where句作成: 端末種別、会社コード指定の場合 */ IF @TERMNO = 'ffff' AND @TANSHU != 'ff' AND @KAISHU != 'ff' BEGIN set @strSQL = @strSQL + ' Where m.端末種別コード = ' + "'" + @TANSHU + "'" + ' and ' + 'm.会社コード=' + "'" + @KAISHU + "'" + ' and ' + 's.ログ種別=' + "'" + '1' + "'" END INSERT INTO TESTT VALUES (@strSQL) /* SQL文実行 */ EXECUTE SP_EXECUTESQL @strSQL [ メッセージ編集済み 編集者: あおい 編集日時 2005-05-27 09:10 ] [ メッセージ編集済み 編集者: あおい 編集日時 2005-05-27 09:23 ] [ メッセージ編集済み 編集者: あおい 編集日時 2005-05-27 09:24 ] |
|
投稿日時: 2005-05-16 13:36
こんにちは。
BCPユーティリティからストアドを実行したことが無いので、IF文が利用できるかどうかは分かりませんが、提示されたストアドの内容で気になる部分がありました。 IF文の中に記述されているWHERE区が文字列結合で記述されていますが、+ "'" +の部分(半角だと分かりにくいかも知れないので、全角だと+ ”’”+)となっていますが、この部分は+ '''' +(全角だと+ ’’’’+)ではないのでしょうか。つまるところ、ストアドの中で”(ダブルクォート)を使用してしまっているところが、引っかかっているとか。 |
|
投稿日時: 2005-05-16 14:29
レス、ありがとうございます。
ご忠告頂いた箇所を全て''''(シングルクォート)に置き換えて実行してみましたが、同様のエラー「Where句の付近が不正です。」で失敗してしまいます。 |
|
投稿日時: 2005-05-16 14:45
クエリアナライザで見ると”(ダブルクォート)だと色が変わらず、’(シングルクォート)だと文字列と判断して色が変わるようです。
実行はどちらでも出来るみたいです。 全部’(シングルクォート)だけにして実行したんですけど。。。 |
|
投稿日時: 2005-05-16 14:58
テスト用のストアドプロシージャ内ではIF文が有効になりました。
下記のストアドでWHERE句が設定されませんでした。 【テスト用ストアドプロシージャ】 ALTER PROCEDURE [TEST] @DBNAME_M nvarchar(20), /* 月別DB名称 */ @DBNAME_B nvarchar(20), /* 基本DB名称 */ @TERMNO char(4), /* 端末番号 */ @TANSHU char(2), /* 端末種別コード */ @KAISHU char(2) /* 会社種別コード */ AS declare @strSQL nvarchar(1000) /* 共通SELECT文作成 */ set @strSQL = 'SELECT m.ターミナル番号,s.障害メッセージ,d.障害コード,d.発生時刻,d.発生モジュール,d.障害理由コード,d.モジュール別詳細情報 ' + 'FROM (' + @DBNAME_M + '..エラーログ詳細情報マスタ m inner join ' + @DBNAME_M + '..エラーログ詳細情報ディティール d on m.詳細情報生成ID=d.詳細情報生成ID) ' + ' inner join ' + @DBNAME_B + '..TELSAS障害コード s on s.障害コード=d.障害コード and m.端末種別コード=s.端末種別コード and m.業務種別コード=s.業務種別コード' IF 'A' = 'B' BEGIN set @strSQL = @strSQL + ' where m.端末種別コード = ' + "'" + @TANSHU + "'" + ' and ' + 'm.会社コード=' + "'" + @KAISHU + "'" + ' and ' + 's.ログ種別=' + "'" + '1' + "'" END /* SQL文実行 */ EXECUTE SP_EXECUTESQL @strSQL |
|
投稿日時: 2005-05-16 15:08
こちらのテスト用ストアドプロシージャ内ではIF文が無効でした。
下記のストアドで「Where句の付近が不正です。」が表示されました。 【テスト用ストアドプロシージャ−★失敗★】 /***********************************************/ /* CSV出力機能(エラーログ詳細情報エクスポート) */ /* */ /* @ CSV.exeより5種の引数を取得する */ /* A SELECT文を作成し、SQLを実行する。 */ /* */ /* 作成日:2003/01/22 */ /***********************************************/ ALTER PROCEDURE [TEST] @DBNAME_M nvarchar(20), /* 月別DB名称 */ @DBNAME_B nvarchar(20), /* 基本DB名称 */ @TERMNO char(4), /* 端末番号 */ @TANSHU char(2), /* 端末種別コード */ @KAISHU char(2) /* 会社種別コード */ AS declare @strSQL nvarchar(1000) /* 共通SELECT文作成 */ set @strSQL = 'SELECT m.ターミナル番号,s.障害メッセージ,d.障害コード,d.発生時刻,d.発生モジュール,d.障害理由コード,d.モジュール別詳細情報 ' + 'FROM (' + @DBNAME_M + '..エラーログ詳細情報マスタ m inner join ' + @DBNAME_M + '..エラーログ詳細情報ディティール d on m.詳細情報生成ID=d.詳細情報生成ID) ' + ' inner join ' + @DBNAME_B + '..TELSAS障害コード s on s.障害コード=d.障害コード and m.端末種別コード=s.端末種別コード and m.業務種別コード=s.業務種別コード' IF 'A' = 'B' BEGIN set @strSQL = @strSQL + ' where m.端末種別コード = ' + "'" + @TANSHU + "'" + ' and ' + 'm.会社コード=' + "'" + @KAISHU + "'" + ' and ' + 's.ログ種別=' + "'" + '1' + "'" END IF 'A' = 'B' BEGIN set @strSQL = @strSQL + ' where m.端末種別コード = ' + "'" + @TANSHU + "'" + ' and ' + 'm.会社コード=' + "'" + @KAISHU + "'" + ' and ' + 's.ログ種別=' + "'" + '1' + "'" END /* SQL文実行 */ EXECUTE SP_EXECUTESQL @strSQL [ メッセージ編集済み 編集者: あおい 編集日時 2005-05-27 09:36 ] |
1|2|3
次のページへ»
