2017-11-17 10 views
0

私は以下のコードを持っており、それがいずれかの集計に含まれていないので、私はそれを実行したとき、私はエラーを取得するテキストデータ型の問題

コラム「Orders.User_Memo1は、」ORDER BY句では無効ですテキスト、ntext型、およびIMAを

:句

BY関数またはGROUPだから、私はo.User_Memo1を追加(または単にCONVERT(VARCHAR(MAX)を削除します)と私は、次のエラーメッセージが表示されますIS NULLまたはLIKE演算子を使用している場合を除いて、比較またはソートすることはできません。

基本的にスタックされていますCONVERTを使用するとすべてエラーが表示されます。私の選択肢は何ですか?

SELECT 
    CAST(o.OrderNo AS INT) AS [OrderNo], 
    CONVERT(VARCHAR(MAX), CAST(SUBSTRING(od.User_Memo1, 
    CHARINDEX('Pack',od.User_Memo1)+5, 8) AS DATE), 1) AS [Prod Due Date], 
    o.User_Date1 AS [3 Week Ack Date], 
    o.User_Date2 AS [1 Week Ack Date], 
    CASE 
     WHEN CONVERT(VARCHAR(MAX), o.User_Memo1) LIKE '%RDS%' 
      THEN CONVERT(VARCHAR(MAX), CAST(SUBSTRING(od.User_Memo1, CHARINDEX('RSD', od.User_Memo1) + 4, 8) AS DATE), 1) 
      ELSE NULL 
    END AS [Revised Ship Date], 
    d.ShipDate 
FROM 
    Orders o 
JOIN 
    OrderDet od ON o.OrderNo = od.OrderNo 
LEFT JOIN 
    DelTicket d ON o.OrderNo = d.OrderNo 
WHERE 
    CONVERT(VARCHAR(MAX), o.User_Memo1) IS NOT NULL 
    AND SUBSTRING(o.User_Memo1, 1, 3) = 'Cut' 
GROUP BY 
    o.OrderNo, 
    CONVERT(VARCHAR(MAX), CAST(SUBSTRING(od.User_Memo1, CHARINDEX('Pack', od.User_Memo1) + 5, 8) AS DATE), 1), 
    o.User_Date1, o.User_Date2, 
    CONVERT(VARCHAR(MAX), o.User_Memo1), CONVERT(VARCHAR(MAX), CAST(SUBSTRING(od.User_Memo1, CHARINDEX('RSD', od.User_Memo1) + 4, 8) AS DATE), 
1), 
    d.ShipDate 
ORDER BY 
    CAST(SUBSTRING(o.User_Memo1, CHARINDEX('Pack',o.User_Memo1) + 5, 8) AS DATETIME) DESC; 
+5

にそれを変更してみてください。もっと説明しようとする必要があります。 – scsimon

+0

私が見ている相違点は、 'Group By 'のあなたのキャスティングを' Order By 'の' Date'としてキャストして、あなたのキャストを 'DateTime'としてキャストすることです。また、 'Group By'では' OrderDet'テーブルではなく 'od.User_Memo1'テーブルを指定しています。 –

+2

'ntext'、' text'、および 'image'データ型は、将来のバージョンのSQL Serverでは削除されます。新しい開発作業でこれらのデータ型を使用しないようにし、現在使用しているアプリケーションを変更することを計画します。代わりに 'nvarchar(max)'、 'varchar(max)'、 'varbinary(max)'を使用してください。 [詳細はこちら](http://msdn.microsoft.com/en-us/library/ms187993.aspx) –

答えて

0

私はあなたのwhere句にcastが欠けていると思います。この

AND CAST(Substring(o.user_memo1, 1, 3) as varchar(3)) = 'Cut' 

コードは私に頭痛を与えることを完全なクエリ

SELECT Cast(o.orderno AS INT) AS [OrderNo], 
     CONVERT(VARCHAR(max), Cast(Substring(od.user_memo1, Charindex('Pack', od.user_memo1) + 5, 8) AS DATE), 1) AS [Prod Due Date], 
     o.user_date1                         AS [3 Week Ack Date], 
     o.user_date2                         AS [1 Week Ack Date], 
     CASE 
     WHEN CONVERT(VARCHAR(max), o.user_memo1) LIKE '%RDS%' 
     THEN CONVERT(VARCHAR(max), Cast(Substring(od.user_memo1, Charindex('RSD', od.user_memo1) + 4, 8) AS DATE), 1) 
     ELSE NULL 
     END                           AS [Revised Ship Date], 
     d.shipdate 
FROM orders o 
JOIN orderdet od ON o.orderno = od.orderno 
LEFT JOIN delticket d ON o.orderno = d.orderno 
WHERE CONVERT(VARCHAR(max), o.user_memo1) IS NOT NULL 
     AND CAST(Substring(o.user_memo1, 1, 3) as varchar(3)) = 'Cut' 
GROUP BY o.orderno, 
      CONVERT(VARCHAR(max), Cast(Substring(od.user_memo1, Charindex('Pack', od.user_memo1) + 5, 8) AS DATE), 1), 
      o.user_date1, 
      o.user_date2, 
      CONVERT(VARCHAR(max), o.user_memo1), 
      CONVERT(VARCHAR(max), Cast(Substring(od.user_memo1, Charindex('RSD', od.user_memo1) + 4, 8) AS DATE), 1), 
      d.shipdate 
ORDER BY Cast(Substring(o.user_memo1, Charindex('Pack', o.user_memo1) + 5, 8) AS DATETIME) DESC;