当StaffId和Password参数值为空字串时报“不能比较和排序text,ntext和Image类型,除非使用IS NULL或Like运算符”错误!但是当参数值不为空字串时一切正常!数据库为Sql Server2000。错误的语句如下:with qry do
  begin
    Connection := Fdbac.DbConnection ;
    Close;
    Sql.Clear;
    Sql.Add('Select FunctionTag as Fun from sysPositionFunction  where PositionID in ');
    Sql.Add('( Select SP.PositionID from hrStaffPosition SP inner join hrStaff S ') ;
    Sql.Add(' On Sp.StaffId = S.StaffId where S.StaffId = :StaffId and ');
    Sql.Add(' S.Password = :Password and S.Isuser = 1 )') ;
    parameters.ParamByName('StaffId').Value := '';// FuserInfo^.StaffId  ;
  parameters.ParamByName('Password').Value := '';// FuserInfo^.Password ; 
  Prepared;
  Open;
 end; 但是使用下面的语句却正常:
   Sql.Text := 'Select FunctionTag as Fun from sysPositionFunction  where PositionID in( Select SP.PositionID from hrStaffPosition SP inner join hrStaff S On Sp.StaffId = S.StaffId where S.StaffId = '' and   S.Password = '' and S.Isuser = 1 )'  ; 请那位说明原因!

解决方案 »

  1.   

    在SQL语句中为空的条件为is null
    你可以在错误的语句Open处打上中断,看看这时的Sql.Text和
    'Select FunctionTag as Fun from sysPositionFunction  where PositionID in( Select SP.PositionID from hrStaffPosition SP inner join hrStaff S On Sp.StaffId = S.StaffId where S.StaffId = '' and   S.Password = '' and S.Isuser = 1 )'
    是否一样
      

  2.   

    首先感觉你的SQL语句组织的不好
    Sql.Add('Select FunctionTag as Fun');
    Sql.Add('  from sysPositionFunction');
    Sql.Add(' where PositionID in ');
    Sql.Add('(Select SP.PositionID');
    Sql.Add('   from hrStaffPosition SP inner join hrStaff S On Sp.StaffId = S.StaffId');
    Sql.Add('  where S.StaffId = :StaffId');
    Sql.Add('    and S.Password = :Password');
    Sql.Add('    and S.Isuser = 1)') ;
     
    使用   
    ParamByName('StaffId').Asstring := '';
    ParamByName('Password').Asstring := '';
    试试
      

  3.   

    如果有空字符串的话,
    你的parambyname会出错的。
    最好是用format函数。
    如:
    sql.add(format('Select FunctionTag as Fun from sysPositionFunction  where PositionID in( Select SP.PositionID from hrStaffPosition SP inner join hrStaff S On Sp.StaffId = S.StaffId where S.StaffId = %d and  S.Password = ''%s'' and S.Isuser = 1 ) ',[FuserInfo^.StaffId  ,FuserInfo^.Password]));
      

  4.   

    你的传送方式:当你传入为空时实际传给予SQL的是NULL,但你的SQL又没设置判断NULL可以用=,默认是IS 来判断NULL,所以会报错
      

  5.   

    parameters.ParamByName('StaffId').Value := QuotedStr('');// FuserInfo^.StaffId  ;
      parameters.ParamByName('Password').Value := QuotedStr('');// FuserInfo^.Password ; 即给字符串加引号!
      

  6.   

    我觉得不能单纯从参数上找问题(不过楼上的有些道理),因为下面的语句执行能通过!,也就是不使用嵌套的Sql查询时没有问题!with qry do
      begin
        Connection := Fdbac.DbConnection ;
        Close;
        Sql.Clear;
        //去掉该行
       // Sql.Add('Select FunctionTag as Fun from sysPositionFunction  where PositionID in ');
        Sql.Add(' Select SP.PositionID from hrStaffPosition SP inner join hrStaff S ') ;
        Sql.Add(' On Sp.StaffId = S.StaffId where S.StaffId = :StaffId and ');
        Sql.Add(' S.Password = :Password and S.Isuser = 1 ') ;
        parameters.ParamByName('StaffId').Value := '';// FuserInfo^.StaffId  ;
      parameters.ParamByName('Password').Value := '';// FuserInfo^.Password ; 
      Prepared;
      Open;
     end;
      

  7.   

    嵌套的话要加'()';
    改为以下试一下
    with qry do
      begin
        Connection := Fdbac.DbConnection ;
        Close;
        Sql.Clear;
         Sql.Add('Select FunctionTag as Fun from sysPositionFunction  where PositionID in ( ');
        Sql.Add(' Select SP.PositionID from hrStaffPosition SP inner join hrStaff S ') ;
        Sql.Add(' On Sp.StaffId = S.StaffId where S.StaffId = :StaffId and ');
        Sql.Add(' S.Password = :Password and S.Isuser = 1 ) ') ;
        parameters.ParamByName('StaffId').Value := '';// FuserInfo^.StaffId  ;
      parameters.ParamByName('Password').Value := '';// FuserInfo^.Password ; 
      Prepared;
      Open;
     end;
      

  8.   

    将功赎罪来了,以下是我在执行类似语句时跟踪得到的SQL语句结果
    exec sp_executesql N'select patientname from patient where patientid in 
    (Select Patientid From labexam where labexamsetid= @P1)
    ', N'@P1 text', '' //为空时,报错exec sp_executesql N'select patientname from patient where patientid in 
    (Select Patientid From labexam where labexamsetid= @P1)
    ', N'@P1 varchar(9)', '000000009' //不为空时从上可以看出再为空时,默认类型为Text,因此会报错,将参数加上类型转换函数正确
    with qry do
      begin
        Connection := Fdbac.DbConnection ;
        Close;
        Sql.Clear;
        Sql.Add('Select FunctionTag as Fun from sysPositionFunction  where PositionID in ');
        Sql.Add('( Select SP.PositionID from hrStaffPosition SP inner join hrStaff S ') ;
        Sql.Add(' On Sp.StaffId = S.StaffId where S.StaffId = Convert(nvarchar(10),:StaffId) and ');
        Sql.Add(' S.Password =Convert(nvarchar(10) :Password) and S.Isuser = 1 )') ;
        parameters.ParamByName('StaffId').Value := userInfo^.StaffId  ;
      parameters.ParamByName('Password').Value :=  FuserInfo^.Password ; 
      Prepared;
      Open;
     end;