Sql server 2008 Delphi7 SQL Server 2008-数据类型varchar和text在大于或等于运算符中不兼容

Sql server 2008 Delphi7 SQL Server 2008-数据类型varchar和text在大于或等于运算符中不兼容,sql-server-2008,delphi,delphi-7,Sql Server 2008,Delphi,Delphi 7,请协助 每当我使用类似以下代码将值传递给参数时,就会出现此错误: parameters.paramByName('ParamVal1').value := trim(TextBox1.Text); parameters.paramByName('ParamVal2').value := trim(TextBox2.Text); 因此,如果其中一个文本框为空,则错误为: varchar和text数据类型在大于或等于运算符中不兼容 出现了 有什么不对劲吗 按照下面的建议运行sqlprofiler

请协助

每当我使用类似以下代码将值传递给参数时,就会出现此错误:

parameters.paramByName('ParamVal1').value := trim(TextBox1.Text);
parameters.paramByName('ParamVal2').value := trim(TextBox2.Text);
因此,如果其中一个文本框为空,则错误为:

varchar和text数据类型在大于或等于运算符中不兼容

出现了

有什么不对劲吗


按照下面的建议运行sqlprofiler之后

exec sp_executesql N'Select * from BLOtherChargeDetails 

where Field1 = @P1 and Field2 >= @P2 and Field2 <= @P3 and
Field3 >= @P4 and Field3 <= @P5 and
Field4 >= @P6 and Field4 <= @P7 and 
Field5 = @P8

Order By Field2, Field3
',N'@P1 varchar(50),@P2 text,@P3 varchar(5),@P4 text,@P5 varchar(5),@P6 varchar(8),@P7 varchar(8),@P8 smallint','Value_P1','','ZZZZZ','','ZZZZZ','20130401','20130611',0
go
exec sp_executesql N'Select*从BLOtherChargeDetails

其中Field1=@P1和Field2>=@P2和Field2=@P4和Field3=@P6和Field4与其说是Delphi的限制,不如说是SQL Server的限制

您正在做的事情与此相关:

select Expression 
from YourTable
where YourTable.TextColum = 'VarCharLiteral'
但使用参数:

select Expression 
from YourTable
where YourTable.TextColum = :VarCharParameter
对于字符文本和字符参数,SQL Server将选择VARCHAR或NVARCHAR作为数据类型

SQL Server不允许您使用TEXT或NTEXT参数,因此字符文本或字符参数的数据类型将为VARCHAR或NVARCHAR

有两种变通方法,根据

  • 远离文本栏
这是首选方式,因为TEXT和NTEXT已被弃用一段时间,请参阅

为此,您必须如下更改您的桌子:

alter table YourTable
alter column TextColum NVARCHAR(MAX)
  • 将文本列强制转换为VARCHAR
这是最容易得到的工作,是一个短期的解决方案

select Expression 
from YourTable
where convert(NVARCHAR(MAX), YourTable.TextColum) = :VarCharParameter

终于让它工作了

出于某种奇怪的原因,一些带有参数的select查询总是给出错误,尽管语句是正确的

在设计期间进行测试时,出现错误“无效参数”

修复方法:

  • 删除参数{在设计时},即具有

    “其中field1=:parameter1和field2>=:parameter2”

    然后通过将活动状态更改为活动来激活TADOQuery

  • 返回参数{在设计时},然后再次激活TADOQuery

  • 尝试在运行时运行查询,这次应该可以运行

    varchar和text数据类型不兼容

    刚刚在使用ftString时遇到此问题。将参数类型更改为ftFixedChar,大小为50(我的大小要求),此后一切正常

    编辑

    我修改了查询,以指定在查询表达式中使用的变量,而不是参数:

    DECLARE @MyVar nvarchar(50)
    SET @MyVar = :MyDelphiVal
    
    SELECT ...
    WHERE mycol LIKE ISNULL(@MyVar, N'') + '%'
    
    允许使用ftString参数类型


    顺便说一句,Delphi 2010、SQL2008 R2、ADO

    如果您提供有关参数是什么数据类型的更多信息,这会有所帮助,但错误相当明显:您正在某处直接比较
    varchar
    text
    ,这是不可能的。如果您不确定这是在哪里发生的,使用SQL Profiler跟踪服务器上的执行可能会有所帮助。虽然自从<代码>文本< /代码>现在,您可能希望考虑改为<代码>(n)VARCHAR(max)< /C> >。感谢Jeroen的深刻回答,但是数据库字段是VARCHAR(50),在使用SqrPrror进行检查之后,看起来只有空白文本框被解析为文本。同样,为什么会这样?您可以在问题中提出以下内容:1)表的DDL(即
    CREATE table
    )。2) 用于访问表的Delphi组件。3) 一些样本数据。4) 设计时文本(只需从TForm/TDataModule复制粘贴查询并粘贴到此处)+1这揭示了与我的答案相反的原因:您的字段是
    VARCHAR
    NVARCHAR
    ,但设计时Delphi参数指示的字段类型是
    text
    。它仍然失败,因为它们不兼容,但恰恰相反。可能导致这种情况的一种情况是,代码最初是在Delphi版本中生成的,该版本仍然假定参数中的任何文本都必须标记为type
    text