将 NTEXT 列与常量值进行比较的正确方法是啥?
Posted
技术标签:
【中文标题】将 NTEXT 列与常量值进行比较的正确方法是啥?【英文标题】:What's the right way to compare an NTEXT column with a constant value?将 NTEXT 列与常量值进行比较的正确方法是什么? 【发布时间】:2010-08-22 21:49:59 【问题描述】:如果我使用类似的东西
[ntext2] <> '1,032.5',
我收到此错误:
数据类型ntext和varchar在不等于运算符中不兼容。
最好的解决方案是对任何列类型都以相同的方式实现比较。 ( 运算符适用于 NVARCHAR 和 INT)。
【问题讨论】:
将其转换为 NVARCHAR(MAX) 并且所有字符串函数都可供您使用... NTEXT 很乱,它已被弃用 - 摆脱它! 如果有人要求 M$ 将其 CRM DB 的 NTEXT 转换为 NVARCHAR,我将签署请愿书 ;) 【参考方案1】:ntext
数据类型已弃用,取而代之的是 nvarchar(max)
数据类型。如果您可以更改表中的数据类型,那将是最好的解决方案。然后将其与 varchar
文字进行比较就没有问题了。
否则,您必须在比较之前转换该值:
cast([ntext2] as nvarchar(max)) <> '1,032.5'
您也可以考虑使用 nvarchar 文字,它可以解决一些类似的数据类型问题:
cast([ntext2] as nvarchar(max)) <> N'1,032.5'
【讨论】:
不幸的是,这不是一个选项,因为 MS 自己使用 ntext,尽管它同时声明它已弃用。我会尝试 N 前缀和强制转换,谢谢你的回答。【参考方案2】:如果您不想投射,您可以在某些情况下使用 LIKE
或 PATINDEX
,如此 MSDN 线程所示:http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/6bd4c661-ea0b-435f-af78-097e61549d41
不带通配符的 LIKE 表达式(在这种情况下)大致相当于相等性测试。
在这种情况下,表达式为:
[ntext2] NOT LIKE '1,032.5'
【讨论】:
LIKE 需要正确索引数据库(AFAIK)。我想避免这种要求。 @noober:LIKE 子句从索引中受益不大,除非它们不包含前导通配符。演员表可能会忽略现有索引。如果您担心性能,最好在有和没有索引的情况下测试每个选项(cast、like、patindex)的性能。如果我今天有时间,我会去看看。 不,我刚刚在不同的 DB 上使用 NTEXT 测试了 LIKE,但其中一个失败了。就是无法执行。问题出在索引上。所以我不能确定 LIKE 在任何地方都可以使用。 @noober:如果您不介意发布错误,我很想看看这个错误。 糟糕...现在可以使用了。很奇怪。如果我再看到这个,我会告诉你的。以上是关于将 NTEXT 列与常量值进行比较的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章