DB2 mit Parameter in der like-Anweisung
Das problem ist wie folgt:
Ich habe eine Prozedur in DB2 erhält, dass die paar Parameter und führt eine Filterung.
Einer der Parameter ist vom Datentyp VARCHAR Dank diesem ist es erforderlich, für eine like-Anweisung. Im SQLServer habe ich einfach mit dem string wie so '%'+prmName+'%'
natürlich funktioniert es nicht in DB2 und muss ersetzt werden mit '%'||prmName||'%'
.
Aber dann diese Fehlermeldung erscheint:
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
Nach Google-ing der Fehler, die ich fand heraus, dass DB2 nicht unterstützt Spaltennamen und-parameter in LIKE
Aussagen, unter einigen anderen.
Da kann ich nicht ändern Sie den code der Anwendung, aber ich brauche, um die übertragung der Prozedur SQLServer DB2, jede Hilfe, um die Problemumgehung ist geschätzt.
Dies ist der code in SQL Server
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
- Und dies ist der Versuch, die select-Anweisung in 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
LOCATE()
:Weiteres Problem ist, dass ich denke, dass die Länge der VARCHAR-variable, die Sie deklarieren. Haben Sie versucht, ob das funktioniert?:
Laut LIKE:
AND UPPER(SUT.NAME) LIKE Upper('%'|| CAST(bla as CHAR(3)) ||'%')
set bla = '%SUP%';
kann nicht verwendet werden, da muss ich übergeben Sie den Wert. 'SUP' ist ein dummy-Wert. Aber die erste Lösung funktioniert. Danke.