2016-08-16 66 views
1

這是我到目前爲止有:如何解決「除非使用IS NULL或LIKE運算符,否則不能比較或排序文本,ntext和圖像數據類型。」

SELECT 
    account, ' ', message_type, 
    MAX(message_no) as max_message_no, message_text 
FROM 
    (SELECT 
     account, message_type, message_no, message_text 
    FROM 
     messages m 
    INNER JOIN 
     receivables r ON m.account = r.aracct 
    WHERE 
     m.account IN (SELECT r.aracct AS account 
         FROM receivables r 
         WHERE r.balance <> 0) 
     AND m.message_type = 'N') t1 
GROUP BY 
    t1.account, t1.message_type, t1.message_text 

我不斷收到錯誤消息:

文本,ntext和圖像數據類型不能比較或排序,使用IS NULL時除外或LIKE運營商。

我基本上是想從每個賬戶最高message_no,我想讓它顯示了message_text,但它不會允許它,因爲它是一個text數據類型。

+0

的這個重複:HTTP://stackoverflow.com/questions/14979413/the-text-ntext-and-image-data-types-cannot-be-compared-or-sorted -except-whe – TheGameiswar

+2

停止使用'text','ntext'或'image'數據類型,因爲MS已經警告他們在十多年內被移除? –

+0

不是我的電話,去和我的老闆談談。我一直在說,多年來 – zfemmer

回答

3

TEXTNTEXTIMAGE被棄用,應該由對應類型VARCHAR(MAX)NVARCHAR(MAX)VARBINARY(MAX)代替。你可能會投你TEXT -column與

CAST(t1.message_text AS VARCHAR(MAX)) 

可能足以在你的子選擇,一旦做到這一點:

SELECT account, ' ', message_type, MAX(message_no) as max_message_no, message_text 
FROM 
(
SELECT account, message_type, message_no, CAST(message_text AS VARCHAR(MAX)) AS message_text 
    FROM messages m INNER JOIN receivables r ON m.account = r.aracct 
     WHERE m.account IN (SELECT r.aracct AS account FROM receivables r WHERE r.balance <> 0) 
     AND m.message_type = 'N' 
) t1 
GROUP BY t1.account, t1.message_type, t1.message_text 
0

你不能比較文字,圖片,types..If你的數據要使用它們,將它們更改爲varchar或nvarchar ..下面

一些例子

create table #t 
    (
    yy text 
    ) 

    insert into #t 
    select '1' 


    --fails 
    select * from #t 
    where yy='1' 
    /**** 
    Msg 402, Level 16, State 1, Line 1 
    The data types text and varchar are incompatible in the equal to operator.**/ 

    --fails 
    select yy from #t 
    group by yy 

    /**** 
    Msg 306, Level 16, State 2, Line 1 
    The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator. 
    ***/ 


    ---Workaround 
    --Try changing the datatypes involved to Varchar or Nvarchar 
    select * from #t 
    where cast(yy as varchar(5))=1 


    select cast(yy as varchar(10)) from #t 
    group by cast(yy as varchar(10)) 

參考文獻:
The text, ntext, and image data > types cannot be compared or sorted, except when using IS NULL or LIKE > operator

+2

小心用'投(YY爲nvarchar的)':-)曾經指定長度... – Shnugo

+1

And btw ::將'TEXT'轉換爲'VARCHAR(MAX)'和'NTEXT'爲'NVARCHAR(MAX)'似乎相當明顯。我的'NVARCHAR'的情況下,你應該設置您的文字與領先的'N'1'' ... – Shnugo

+0

這就是對的,謝謝 – TheGameiswar

相關問題