- PR -

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

投稿者投稿内容
檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 2005-05-13 17:34
<実行環境>
OS:Windows2003Server SP1
DB:SQLServer2000 SP4

 上記の環境でSQLServer2000のBCPユーティリティ(bcp.exe)をコマンドプロンプトから実行したところ、BCPの引数で指定したストアドプロシージャ内のIF文の条件が有効にならず、IF文内のコードが必ず実行されてしまいました。
 
●IF文の条件の間違いを考慮して単純な条件(IF 'A'='B')で実行してみましたが、やはり、IF文内のコードが必ず実行されてしまいます。
●ストアド自体はクエリアナライザで正常に実行されます(BCPから実行した場合に限るようです)。

原因をご存知の方、
似たような現象に合われた方がいらっしゃいましたら、
解決方、アドバイスなど頂きたく、宜しくお願い致します。
水谷
会議室デビュー日: 2004/05/07
投稿数: 17
お住まい・勤務地: 福島県
投稿日時: 2005-05-13 20:20
水谷です。

bcp でストアドプロシージャの実行、ということをやったことがないのですが、
もし可能ならば bcp を実行したときのコマンドラインやストアドプロシージャの
内容等を教えて頂ければアドバイスしやすいかもしれません。
檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 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 ]
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2005-05-16 13:36
こんにちは。

BCPユーティリティからストアドを実行したことが無いので、IF文が利用できるかどうかは分かりませんが、提示されたストアドの内容で気になる部分がありました。

IF文の中に記述されているWHERE区が文字列結合で記述されていますが、+ "'" +の部分(半角だと分かりにくいかも知れないので、全角だと+ ”’”+)となっていますが、この部分は+ '''' +(全角だと+ ’’’’+)ではないのでしょうか。つまるところ、ストアドの中で”(ダブルクォート)を使用してしまっているところが、引っかかっているとか。
檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 2005-05-16 14:29
レス、ありがとうございます。

ご忠告頂いた箇所を全て''''(シングルクォート)に置き換えて実行してみましたが、同様のエラー「Where句の付近が不正です。」で失敗してしまいます。

檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 2005-05-16 14:45
クエリアナライザで見ると”(ダブルクォート)だと色が変わらず、’(シングルクォート)だと文字列と判断して色が変わるようです。
実行はどちらでも出来るみたいです。
全部’(シングルクォート)だけにして実行したんですけど。。。
檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 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
檸檬
ベテラン
会議室デビュー日: 2004/04/26
投稿数: 87
投稿日時: 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 ]

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