DB2 использует параметры в операторе like - PullRequest
0 голосов
/ 26 июля 2011

Проблема заключается в следующем: У меня есть процедура в 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

1 Ответ

4 голосов
/ 26 июля 2011

Вы можете использовать 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%, переменная хоста заполняется пробелами при назначении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...