【问题标题】:The text, ntext, and image data > types cannot be compared or sorted, except when using IS NULL or LIKE > operatortext、ntext 和 image 数据 > 类型不能进行比较或排序,除非使用 IS NULL 或 LIKE > 运算符
【发布时间】:2013-02-05 10:16:54
【问题描述】:

email 属于订桌,在我们的 Microsoft sql server 中定义为“Text”类型

SELECT email, 
 COUNT(email) AS NumOccurrences
FROM Booking
GROUP BY email
HAVING ( COUNT(email) > 1 )

运行上述查询后(尝试在预订中查找重复的电子邮件) 我收到这样的错误消息:

text、ntext 和 image 数据 类型不能比较或排序,除非使用 IS NULL 或 LIKE 运算符。

我正在使用 Microsoft Sql

【问题讨论】:

  • 为什么使用text 发送电子邮件? “ntext 、 text 和 image 数据类型将在 Microsoft SQL Server 的未来版本中删除。避免使用这些数据类型” msdn.microsoft.com/en-us/library/ms187993.aspx 您不能按 text 分组:"group_by_expression 中不能使用 text、ntext 和 image 类型的列" msdn.microsoft.com/en-us/library/ms177673.aspx
  • 您使用的是哪个版本的 SQL Server?
  • @TimSchmelter 谢谢,但它已经过时并且正在生产中,我们不太可能改变它
  • @HamletHakobyan 老了,非常感谢您的帮助
  • @shanyangqu: 但是,old 不是有效的 sql-server 版本;)

标签: sql sql-server


【解决方案1】:

由于我的 ORM 存在问题,我对接受的答案有疑问。此答案只是在接受的答案不起作用时的一种解决方法,并且仅当您只有 group by 中的列时才有效,因为它是必需的,因此您可以在选择中包含该列。

它在聚合函数内部强制转换列,因此在group by中不需要它,并且不会发生错误并且返回的数据应该仍然正确。

MIN(CAST(email AS NVARCHAR(4000))) as email

理想情况下,您会找到一种方法来避免这种黑客攻击,但这在某些情况下可能很有用。

【讨论】:

    【解决方案2】:

    既然你用的是SQL Server,为什么不把数据类型改成VARCHAR(100)呢?

    要在不更改数据类型的情况下解决此错误,当在ORDER BY 子句或SELECT 语句的GROUP BY 子句中使用TEXT or NTEXT 列时,需要将其转换为VARCHAR or NVARCHAR。例如,有点乱

    SELECT  CAST(email AS NVARCHAR(100)) email, 
            COUNT(CAST(email AS NVARCHAR(100))) AS NumOccurrences
    FROM    Booking
    GROUP   BY CAST(email AS NVARCHAR(100))
    HAVING  COUNT(CAST(email AS NVARCHAR(100))) > 1 
    

    【讨论】:

      猜你喜欢
      • 2011-11-25
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      相关资源
      最近更新 更多