Проблема заключается в следующем:
У меня есть процедура в DB2, которая получает пару параметров и выполняет фильтрацию.
Одним из параметров является VARCHAR, который необходим для оператора like. В 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
После ошибки Google я обнаружил, что 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
И это попытка оператора select в DB2:
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