是否有任何方法可以通过SQL Server 2005中的文本(或ntext)进行DISTINCT或分组?

时间:2009-06-22 16:11:45

标签: sql sql-server types

在表格中,我有一个名为MEMO_TEXT的列,它是一种文本数据类型。当我尝试创建一个视图并使用GROUP BY时,我收到以下错误:

  

SQL Server数据库错误:无法比较或排序text,ntext和image数据类型,除非使用IS NULL或LIKE运算符。

当我尝试对查询执行DISTINCT时,我收到此错误。关于如何解决这个问题的任何想法?

如果您需要更多信息,请告诉我们。

4 个答案:

答案 0 :(得分:38)

围绕它的一个方法是将其转换为nvarchar(max)

这是一种documented方法,可将字符串长度增加到4,000以上:

  

nvarchar [ ( n | max ) ]

     

可变长度的Unicode字符串数据。 n定义字符串长度,可以是1到4,000之间的值。 max表示最大存储大小为2 ^ 31-1个字节(2 GB)。存储大小(以字节为单位)是输入数据的实际长度的两倍+ 2个字节。 nvarchar的ISO同义词是国家字符变化和国家字符变化。

类似的技巧适用于varchar()

答案 1 :(得分:22)

试试这些......

SELECT DistinctMemo = DISTINCT(CAST(MEMO_TEXT AS varchar(max)))
FROM   MyTable

-- or

SELECT DistinctMemo = CAST(MEMO_TEXT AS varchar(max))
FROM   MyTable
GROUP BY CAST(MEMO_TEXT AS varchar(max))

答案 2 :(得分:1)

您知道ntext字段中永远不会有重复数据吗?您可以在其他字段的派生表中执行distinct,然后使用ntext字段连接到表,并在外部查询中抓取它。

类似的东西(假设field3是ntext字段)

select mt.idfield, a.field1, a.field2, mt.field3 
from mytable mt
join 
(select disitinct mt1.idfield, mt1.field1, mot.field2 from mytable mt1
join myothertable mot on mt1.idfield = mot.idfield) a 
   on a.ifield = mt.idfield

答案 3 :(得分:0)

您能否只将列的数据类型更改为nvarchar(max)?

考虑放入另一个列,其中包含备注字段的前40个字符左右,并对其进行分组。如果你有很多文本,那么对备忘录字段进行分组会非常慢。

UPDATE myTable SET myNewField = LEFT(myOldField, 40);