web-dev-qa-db-ja.com

SQL Server 2005でDISTINCTまたはテキスト(またはntext)でグループ化する方法はありますか?

テーブルに、テキストデータ型であるMEMO_TEXTという列があります。ビューを作成してGROUP BYを使用しようとすると、次のエラーが発生します。

SQL Serverデータベースエラー:IS NULLまたはLIKE演算子を使用する場合を除いて、text、ntext、およびimageデータ型は比較またはソートできません。

クエリに対してDISTINCTを実行しようとすると、このエラーが発生します。これを回避する方法に関するアイデアはありますか?

さらに情報が必要な場合は、お知らせください。

27
Ascalonian

それを回避する1つのハックは、それをnvarchar(max)としてキャストすることです。

これは、文字列の長さを4,000を超えて増やす 文書化 方法です。

nvarchar [ ( n | max ) ]

可変長のUnicode文字列データ。 nは文字列の長さを定義し、1〜4,000の値を指定できます。 maxは、最大ストレージサイズが2 ^ 31-1バイト(2 GB)であることを示します。ストレージサイズは、バイト単位で、実際の長さの2倍です。入力されたデータの+ 2バイト。 nvarcharのISO同義語は、国別文字と国別文字で異なります。

同様のトリックが varchar() にも当てはまります。

38
Rowland Shaw

これらを試してください...

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))
24
Scott Ivey

Ntextフィールドに繰り返しデータが存在しないことをご存知ですか?他のフィールドの派生テーブルで区別を行い、ntextフィールドを使用してテーブルに結合し、外部クエリでそれを取得できます。

のようなもの(フィールド3が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
1
HLGEM

列のデータ型をnvarchar(max)に変更できますか?

メモフィールドの最初の40文字程度を占める別の列に入力し、それをグループ化することを検討してください。大量のテキストがある場合、メモフィールドのグループ化は非常に遅くなります。

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