问题如下:
我在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
答案 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%被分配给该主变量,则主机变量在赋值时填充空白。