2011-07-26 5 views
1

問題は次のとおりです。 私はDB2で、いくつかのパラメーターを受け取り、フィルターをかけるプロシージャーを持っています。 パラメータの1つは、like文のために必要なVARCHARです。 SQLServerでは、単に'%'+prmName+'%'のような文字列を追加するだけですが、当然これはDB2では機能しませんので、'%'||prmName||'%'に置き換える必要があります。 しかし、その後、このエラーがポップアップ表示:同様のステートメントでパラメーターを使用するDB2

DB2 Database Error: ERROR [42824] [IBM][DB2/NT] SQL0132N A LIKE predicate or POSSTR scalar function is not valid because the first operand is not a string expression or the second operand is not a string. A LOCATE or POSITION scalar function is not valid because the first operand is not a string or the second operand is not a string expression. LINE NUMBER=6. SQLSTATE=42824

私はDB2が他のカップルの中で、LIKE文でカラム名とパラメータをサポートすることができないことが判明グーグル-INGのエラーの後。

私はアプリケーションのコードを変更できませんが、SQLServerプロシージャをDB2に転送する必要があるため、回避策を見つけるための助けに感謝します。

これは、SQLServerの

CREATE PROCEDURE [DATABYUSERNAME] 
    (
     @prmQuestionnaireId int, 
     @prmStartDate DateTime, 
     @prmEndDate DateTime, 
     @prmUserName nvarchar(100) 
    )  
AS 
    SELECT * from ExecutedQuestionnaire EQ left outer join SecurityUserTable SUT 
    on EQ.CreatedBy = SUT.UserId 
    where EQ.CreationDate between @prmStartDate and @prmEndDate 
    and SUT.Name LIKE '%'[email protected]+'%' 
    and EQ.QuestionnaireId = @prmQuestionnaireId   
    RETURN 

のコードであり、これはDB2でのSELECT文の試みです:

BEGIN ATOMIC 
DECLARE bla VARCHAR(100); 
DECLARE search VARCHAR(100); 
set bla = 'sup'; 

SELECT EQ.EXECUTEDQUESTIONNAIREID,EQ.EXECUTEDQUESTIONNAIRESTATUSID,EQ.CREATIONDATE,EQ.CREATEDBY,EQ.ISCOMPLETE,EQ.QUESTIONNAIREID, 
        SUT.NAME, SUT.USR 
    FROM EXECUTEDQUESTIONNAIRE EQ 
    LEFT OUTER JOIN SECURITYUSERTABLE SUT 
    ON EQ.CREATEDBY = SUT.USERID 
    WHERE EQ.CREATIONDATE BETWEEN '2010-12-01' and '2011-12-01' 
    AND UPPER(SUT.NAME) LIKE Upper(CAST('%'||bla||'%' as VARCHAR(100))) 
    AND EQ.QUESTIONNAIREID = 1; 
END 

答えて

5

あなたはLOCATE()を使用することができます。

AND LOCATE(UPPER(bla), UPPER(SUT.NAME)) > 0 

別のissu私はあなたが宣言するVARCHAR変数の長さを考えています。これが動作するかどうか、あなたは試してみました?:

BEGIN ATOMIC 
DECLARE bla CHAR(5); 
DECLARE search VARCHAR(100); 
set bla = '%SUP%'; 

SELECT EQ.EXECUTEDQUESTIONNAIREID,EQ.EXECUTEDQUESTIONNAIRESTATUSID,EQ.CREATIONDATE,EQ.CREATEDBY,EQ.ISCOMPLETE,EQ.QUESTIONNAIREID, 
        SUT.NAME, SUT.USR 
    FROM EXECUTEDQUESTIONNAIRE EQ 
    LEFT OUTER JOIN SECURITYUSERTABLE SUT 
    ON EQ.CREATEDBY = SUT.USERID 
    WHERE EQ.CREATIONDATE BETWEEN '2010-12-01' and '2011-12-01' 
    AND UPPER(SUT.NAME) LIKE bla 
    AND EQ.QUESTIONNAIREID = 1; 
END 

LIKEによると:

をLIKE述語で指定されたパターンがパラメーター・マーカーで、固定長文字ホスト変数を置き換えるために使用された場合パラメーター・マーカーでは、正しい長さのホスト変数の値を指定します。 正しい長さがでない場合、selectは意図した結果を返しません。例えば、ホスト変数がCHAR(10)と定義されていて、そのホスト変数に値WYSE%が割り当てられている場合、ホスト変数には代入時にブランクが埋め込まれます。

+0

@Drakche:次にこれ?:AND UPPER(SUT.NAME)LIKE Upper( '%' || CAST(bla as CHAR(3))|| '%') ' –

+0

'set bla =' %SUP% ';'は値を渡す必要があるため使用できません。 「SUP」はダミー値です。しかし、最初の解決策があります。ありがとう。 – Drakche

+0

+1、これも私の問題を解決しました。 –

関連する問題