Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server DB2在like语句中使用参数_Sql Server_Stored Procedures_Db2 - Fatal编程技术网

Sql server DB2在like语句中使用参数

Sql 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标量函数无效,因为第一个操作数不是字符串表达式,或者第二个操作数不是字符串。定位或位置标量

问题如下: 我在DB2中有一个过程,它接收两个参数并进行过滤。 其中一个参数是like语句所需的VARCHAR。在SQLServer中,我只是简单地连接字符串,如so
'%'+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'是一个伪值。但第一个解决方案是可行的。谢谢