【问题标题】:Is there any way to DISTINCT or group by a text (or ntext) in SQL Server 2005?有没有办法在 SQL Server 2005 中按文本(或 ntext)进行区分或分组?
【发布时间】:2010-11-04 21:51:59
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sql sql-server types


    【解决方案1】:

    解决它的一个技巧是将其转换为nvarchar(max)

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

    nvarchar [ ( n | max ) ]

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

    类似的技巧适用于varchar()

    【讨论】:

    • +1 根本不会称之为 hack,nvarchar(max) 取代了 ntext。
    • 不过,将底层结构更改为 nvarchar(max) 不会那么麻烦......
    【解决方案2】:

    试试这些...

    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))
    

    【讨论】:

      【解决方案3】:

      你知道ntext字段中永远不会有重复数据吗?您可以在派生表中对其他字段执行不同的操作,然后使用 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
      

      【讨论】:

        【解决方案4】:

        你能把列的数据类型改为nvarchar(max)吗?

        考虑在另一列中输入备注字段的前 40 个字符左右,然后对其进行分组。如果您有很多文本,那么在备忘录字段上进行分组会非常慢。

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

        【讨论】:

          猜你喜欢
          • 2021-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-08
          • 1970-01-01
          • 1970-01-01
          • 2010-10-10
          • 1970-01-01
          相关资源
          最近更新 更多