2017-02-21 2 views
0

У меня есть этот запрос, который вызывает ошибку:Cast Ошибка в ORDER BY Пунктом

Cannot convert from nvarchar to bigint

Но только на ORDER BY области.

SELECT TOP (25) 
    CAST(AttrValue AS BIGINT) AttrValue 
FROM 
    tblattributevalue AS attVal WITH (NOLOCK) 
INNER JOIN 
    tblattribute AS att WITH (NOLOCK) ON Att.AttrID = attVal.AttrID 
             AND att.AttrName = 'Rank Gold' 
LEFT JOIN 
    #books AS P ON P.BookID = attVal.BookId 
WHERE 
    attVal.GenreID = @GenreID 
    AND attVal.Active = 1 
    AND att.Active = 1 
    AND P.BookID IS NOT NULL 
ORDER BY 
    CAST(AttrValue AS BIGINT) 

Если я закомментируйте ORDER BY, она работает просто отлично. Верхний кастинг работает и использует одни и те же данные. Отображаемые данные:

AttrValue: 
28, 
24, 
2, 
6, 
89, 
27, 
1, 
4, 
234, 
3, 
7, 
9 

Любые идеи относительно того, почему он преобразует в SELECT, но не на ORDER BY?

+0

Просто попробуйте дать '..... order by 1;'. – Wanderer

+0

Удалите бросок, у вас есть значение, которое невозможно преобразовать в большой int. Почему у вас есть бросок в порядке clase, это уничтожит надежду на использование индекса ..... не используйте какую-либо функцию в левой части критерия или порядка на – Juan

+0

Первые 25 результатов (неупорядоченные) чтобы быть отличным до bigint, что не вызывает ошибок. Когда вы выбираете заказ, он должен отбросить их всех до сортировки, и у вас есть хотя бы одно значение, которое нельзя отнести к bigint. Это вызывает ошибку. – Forklift

ответ

0

Спасибо всем за ответы, но по какой-то причине мои ценности не были преобразующего на пункте ORDER BY. То, что работало, помещало все в временную таблицу, а затем заказывало оттуда.

SELECT 
CAST(AttrValue as BIGINT) AttrValue 
,BookID 
INTO #sortBooks 
FROM tblattributevalue AS attVal WITH (NOLOCK) 
INNER JOIN tblattribute AS att WITH (NOLOCK) ON Att.AttrID = attVal.AttrID 
      AND att.AttrName = 'Rank Gold' 
LEFT JOIN #books AS P ON P.BookID = attVal.BookId 
WHERE attVal.GenreID = @GenreID 
AND attVal.Active = 1 
AND att.Active = 1 
AND P.BookID IS NOT NULL 

Затем я захватил те значения, которые нужно заказать.

SELECT TOP (25) BookID 
FROM #sortBooks 
ORDER BY AttValue 

Так по какой-то причине она не бросала на ORDER BY для некоторых жанров и других это было. Но он разрешал кастинг на SELECT, затем я размещал все на временной таблице и использовал это для заказа книг. Это то, что работает по моему сценарию.

2

Ваш запрос возвращает TOP 25, но когда вы ORDER BY что-то получаете ошибку конвертации. Если вы отбросите ORDER BY, вы получите другой набор данных (очевидно ...), но без ошибки преобразования.

При кастинге все значения сначала должны быть преобразованы, а затем упорядочены. Поэтому где-то в вашем списке значений есть что-то, что невозможно преобразовать в тип данных BIGINT.

Попробуйте запустить этот запрос:

SELECT AttrValue 
FROM tblattributevalue AS attVal WITH (NOLOCK) 
INNER JOIN tblattribute AS att WITH (NOLOCK) ON Att.AttrID = attVal.AttrID 
      AND att.AttrName = 'Rank Gold' 
LEFT JOIN #books AS P ON P.BookID = attVal.BookId 
WHERE attVal.GenreID = @GenreID 
AND attVal.Active = 1 
AND att.Active = 1 
AND P.BookID IS NOT NULL 
AND ISNUMERIC(AttrValue) = 0 

EDIT:

Другим важным фактором при проверке в том, что некоторые специальные символы, такие как запятые, знаки доллара, и дефис считаются как числовые значения, но может представлять проблему для определенных преобразований. Для примера, запустите это:

CREATE TABLE NumericTestTable (String NVARCHAR(55)) 
; 
INSERT INTO NumericTestTable (string) VALUES (N'1234567890') 
; 
INSERT INTO NumericTestTable (string) VALUES (N'$1234567890') 
; 
INSERT INTO NumericTestTable (string) VALUES (N'12.34567890') 
; 
INSERT INTO NumericTestTable (string) VALUES (N'-1234567890') 
; 
INSERT INTO NumericTestTable (string) VALUES (N't1234567890') 
; 
INSERT INTO NumericTestTable (string) VALUES (N'1*234567890') 
; 
INSERT INTO NumericTestTable (string) VALUES (N'@1234567890') 
; 
INSERT INTO NumericTestTable (string) VALUES (N'#1234567890') 
; 
SELECT string, ISNUMERIC(string) FROM NumericTestTable 
; 
SELECT string, ISNUMERIC(string), CAST(string AS BIGINT) 
FROM NumericTestTable 
WHERE ISNUMERIC(string) = 1 
; 
/* Returns error: 
Error converting data type nvarchar to bigint.. 
Error 8114. SQLSTATE 42000. Severity 16. MsgState 5. Line 1. 
*/ 
+0

И если вам интересно узнать, каковы ваши значения ошибки: SELECT «Значения задачи» в качестве MyCol, AttrValue FROM tblattributevalue AS attVal WITH (NOLOCK) INNER JOIN tblattribute AS att WITH (NOLOCK) ON Att.AttrID = attVal.AttrID И att.AttrName = 'Ранг Золото' LEFT JOIN #books AS P = О P.BookID attVal.BookId ГДЕ attVal.GenreID = @GenreID И attVal.Active = 1 И att.Active = 1 И P.BookID не является NULL И ISNUMERIC (AttrValue)! = 0 – granadaCoder

+0

Фактически, 'ISNUMERIC() = 0' конкретно означает 'Возвращаемые значения, которые не являются числовыми', то есть' ISNUMERIC ('123t5') '= 0, поэтому запрос, который я написал, должен возвращать проблемные значения. – 3BK

+0

Тип данных столбца - NVARCHAR, при использовании ISNUMERIC он ничего не возвращает. При использовании! =, Как и предлагаемый @granadaCoder, он возвращает значения. Но мы хотим, чтобы результат набора был ORDER BY AttValue. В этом конкретном жанре есть только 12 книг с «Rank Gold» в качестве AttrName. Я могу видеть возвращаемые значения, перечисленные выше, они имеют только числа. CAST на SELECT работает, но не на ORDER BY. – user3786182

Смежные вопросы