DB2在like语句中使用参数

时间:2011-07-26 10:13:52

标签: sql-server stored-procedures db2

问题如下: 我在DB2中有一个过程,它接收几个参数并进行过滤。 其中一个参数是类似语句所需的VARCHAR。在SQLServer中,我只是像'%'+prmName+'%'一样加入字符串,当然这在DB2中不起作用,需要用'%'||prmName||'%'替换。 但随后出现了这个错误:

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语句中的列名和参数,以及其他几个语句中的列名和参数。

由于我无法更改应用程序的代码,但我需要将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 '%'+@prmUserName+'%'
    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

1 个答案:

答案 0 :(得分:4)

您可以使用LOCATE()

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

另一个问题是我认为您声明的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谓词中指定的模式是参数标记并且使用固定长度字符主变量替换参数标记时,请为主机变量指定正确长度的值。 如果未指定正确的长度,则选择不会返回预期的结果。例如,如果主变量被定义为CHAR(10)并且值WYSE%被分配给该主变量,则主机变量在赋值时填充空白