【问题标题】:Delphi7 SQL Server 2008 - The data types varchar and text are incompatible in the greater than or equal to operatorDelphi7 SQL Server 2008 - 数据类型varchar和text在大于或等于运算符中不兼容
【发布时间】:2013-06-02 19:56:43
【问题描述】:

请帮忙,

每当我使用类似于以下的代码将值传递给参数时,我都会收到此错误:

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

【问题讨论】:

  • 如果您提供有关参数是什么数据类型的更多信息会有所帮助,但错误很明显:您在某处直接比较varchartext,这是不可能的。如果您不确定这发生在哪里,使用 SQL Profiler 跟踪服务器上的执行可能会有所帮助。虽然由于text 现在是deprecated,但您可能希望考虑改为(n)varchar(max)

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


【解决方案1】:

数据类型varchar和text不兼容

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

编辑

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

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

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

允许 ftString 参数类型。

顺便说一句,德尔福 2010,SQL2008 R2,ADO

【讨论】:

    【解决方案2】:

    终于搞定了;

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

    在设计时测试,出现“Invalid Parameter”错误。

    修复:

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

      的部分

      "其中 field1 = :parameter1 和 field2 >= :parameter2"

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

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

    尝试在运行时运行查询,这次它应该可以工作了。

    【讨论】:

    • +1 这揭示了与我的答案相反的原因:您的字段是 VARCHARNVARCHAR,但设计时 Delphi 参数指示字段类型为 TEXT。它仍然失败,因为它们不兼容,但恰恰相反。可能导致这种情况的一种情况是代码最初是在 Delphi 版本中制作的,该版本仍然假定参数中的任何类似文本的内容都必须标记为类型 TEXT
    【解决方案3】:

    这与其说是 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 列。

    这是首选方式,因为 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
    

    【讨论】:

    • 感谢 Jeroen 的有见地的回答,但数据库字段是 varchar(50),在使用 sqlprofiler 检查后,似乎只有空白文本框被解析为文本。再说一遍,为什么会这样?
    • 您能否在您的问题中提出以下内容:1)您的表的 DDL(即它的 CREATE TABLE)。 2) 您使用哪些 Delphi 组件来访问您的表格。 3)一些样本数据。 4) 设计时文本(只需从 TForm/TDataModule 复制粘贴您的查询并将其粘贴到此处)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多