Sql server DB2在like语句中使用参数
问题如下: 我在DB2中有一个过程,它接收两个参数并进行过滤。 其中一个参数是like语句所需的VARCHAR。在SQLServer中,我只是简单地连接字符串,如soSql server DB2在like语句中使用参数,sql-server,stored-procedures,db2,Sql Server,Stored Procedures,Db2,问题如下: 我在DB2中有一个过程,它接收两个参数并进行过滤。 其中一个参数是like语句所需的VARCHAR。在SQLServer中,我只是简单地连接字符串,如so'%'+prmName+'%',这在DB2中自然不起作用,需要用'%'| | prmName | |'%'替换。 但随后会出现以下错误: DB2数据库错误:错误[42824][IBM][DB2/NT]SQL0132N LIKE谓词或POSSTR标量函数无效,因为第一个操作数不是字符串表达式,或者第二个操作数不是字符串。定位或位置标量
'%'+prmName+'%'
,这在DB2中自然不起作用,需要用'%'| | prmName | |'%'
替换。
但随后会出现以下错误:
DB2数据库错误:错误[42824][IBM][DB2/NT]SQL0132N LIKE谓词或POSSTR标量函数无效,因为第一个操作数不是字符串表达式,或者第二个操作数不是字符串。定位或位置标量函数无效,因为第一个操作数不是字符串,或者第二个操作数不是字符串表达式。行号=6。SQLSTATE=42824
在谷歌搜索错误后,我发现DB2不能支持语句中的列名和参数,比如语句
由于我无法更改应用程序的代码,但我需要将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
您可以使用:
另一个问题是我认为您声明的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谓词中指定的模式是参数标记,并且使用固定长度的字符宿主变量替换参数标记,请为宿主变量指定正确长度的值如果未指定正确的长度,则选择不会返回预期结果。例如,如果主机变量定义为CHAR(10),并且将WYSE%的值分配给该主机变量,主机变量在分配时用空格填充
您可以使用:
另一个问题是我认为您声明的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谓词中指定的模式是参数标记,并且使用固定长度的字符宿主变量替换参数标记,请为宿主变量指定正确长度的值如果未指定正确的长度,则选择不会返回预期结果。例如,如果主机变量定义为CHAR(10),并且将WYSE%的值分配给该主机变量,主机变量在分配时用空格填充
@德拉克切:那么这个?:和UPPER(SUT.NAME)类似于UPPER(“%”| | | CAST(blaas CHAR(3))| |‘%”)
设置bla='%SUP%”“代码>无法使用,因为我需要传递值。”SUP'是一个伪值。但第一个解决方案是可行的。谢谢。@Drakche:那么这个?:和UPPER(SUT.NAME)像UPPER(“%”| | | CAST(bla as CHAR(3))| |‘%”)
设置bla='%SUP%”“代码>无法使用,因为我需要传递值。”SUP'是一个伪值。但第一个解决方案是可行的。谢谢