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

时间:2013-06-06 17:22:54

标签: sql-server-2008 delphi delphi-7

请协助,

每当我使用类似于:

的代码将值传递给参数时,我都会收到此错误
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

3 个答案:

答案 0 :(得分:1)

这不是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的数据类型。

有两种解决方法,改编自SQL SERVER – Fix: Error : 402 The data types ntext and varchar are incompatible in the equal to operator

  • 远离TEXT colums。

这是首选的方法,因为TEXT和NTEXT已被弃用了一段时间,请参阅nvarchar(max) vs NText

因为你必须像这样改变你的桌子:

alter table YourTable
alter column TextColum NVARCHAR(MAX)
  • 将您的TEXT列投射到VARCHAR

这是最容易开始工作的,是一种短期解决方案。

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

答案 1 :(得分:1)

终于搞定了;

由于某些奇怪的原因,一些带参数的选择查询总是会出错,尽管语句是正确的。

在设计时测试,出现错误“无效参数”。

修复:

  1. 删除参数{在设计时},即

    部分

    “where field1 =:parameter1 and field2&gt; =:parameter2”

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

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

  3. 尝试在运行时运行查询,这次应该可以正常运行。

答案 2 :(得分:0)

  

数据类型varchar和文本不兼容

使用 ftString 刚出现此问题。将参数类型更改为 ftFixedChar ,大​​小为50(我的尺寸要求),之后一切都很好。

编辑

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

DECLARE @MyVar nvarchar(50)
SET @MyVar = :MyDelphiVal

SELECT ...
WHERE mycol LIKE ISNULL(@MyVar, N'') + '%'

允许 ftString 参数类型。

BTW,Delphi 2010,SQL2008 R2,ADO