2016-12-21 6 views
-1

Когда я запускаю следующий запрос с SELECT * я получаю сообщение об ошибке сказав:SQL Server - Ошибка преобразования типа данных NVARCHAR в BigInt

[S0005] [8114] Ошибка преобразования типа данных NVARCHAR в BigInt.

SELECT * FROM (
       SELECT * , ROW_NUMBER() OVER (ORDER BY CAST(id as BIGINT)) AS RowNum 
       FROM users 
      ) AS users 
      WHERE users.RowNum BETWEEN 0 AND 5 ; 

Когда я запускаю этот запрос только с SELECT id , ROW_NUMBER() ... все работает.

My DB выглядит следующим образом:

Image of database

Этот запрос хорошо работать с другой таблицей, где id колонка NVARCHAR

ID столбец только номер, и если я бросил его, как: CAST (идентификатор как NVARCHAR), я получаю такую ​​же ошибку.

EDIT:

I Found проблему с колонкой ID значения

ID 46903836 ID 9100000004

Малые идентификаторы не имеют ведущие нули

+0

Не нужно указывать ID как 'BIGINT', если это уже' BIGINT'. Вам нужно только бросить его, если это «NVARCHAR». Если у вас есть письмо в поле 'ID', потому что это' NVARCHAR', то вы не можете преобразовать его в числовой. –

+1

Ну сообщение об ошибке довольно ясно. У вас есть значение в вашем varchar, которое не является допустимым bigint. Вот почему вы всегда должны использовать правильный тип данных. –

+0

, почему вы выбрали ID как BIGINT, если на вашем изображении ID - BIGINT? –

ответ

0

Обычно, когда я получаю эту ошибку это происходит потому, что там является пробелом на передней или конце столбца. Вот как я это исправим.

SELECT * FROM (
      SELECT * , ROW_NUMBER() OVER (ORDER BY CAST(LTRIM(RTRIM(id)) as BIGINT)) AS RowNum 
      FROM users 
     ) AS users 
     WHERE users.RowNum BETWEEN 0 AND 5 ; 

Это обеспечит ID только число только я также предполагаю, что нет каких-либо буквенные символы с идентификатором.

+0

Промежуточные пространства почти никогда не имеют значения для сравнений (где/имеют) и особенно преобразований.У вас есть пример, когда определенное количество ведущих или конечных пробелов вызвало ошибку преобразования? – scsimon

+0

У меня нет, но у меня возникли проблемы с кастингом или преобразованием NVARCHAR или VARCHAR в числовой тип данных, когда в строке есть пробелы. –

+0

Возможно, посередине (что не было бы решено с обрезкой), но я никогда не видел, чтобы это происходило как ведущий, так и конечный. было просто интересно, так как ваш ответ ссылался на причинность этой проблемы. – scsimon

0

Поле IDBIGINT (вы разместили свою структуру таблицы), это не вызывает ошибки в вашем вопросе.

Но, так как это неполезный CAST вы можете переписать запрос следующим образом:

SELECT * FROM (
    SELECT * , ROW_NUMBER() OVER (ORDER BY id) AS RowNum 
    FROM users 
) AS users 
WHERE users.RowNum BETWEEN 0 AND 5 ; 
+0

Хотя это правда, это не объясняет ошибку, которая почти наверняка не происходит. Он опубликовал код snippet – scsimon

+0

. Я не получаю эту ошибку, когда я делаю только SELECT * FROM ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS RowNum От пользователей ) Пользователи AS WHERE users.RowNum BETWEEN 0 AND 5; , но мне также нужны другие столбцы, такие как имя, адрес электронной почты и т. Д. –

+0

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

0

Вы не должны бросить свой столбец ID, как это уже в BigInt типа данных

SQL server database]

+0

, но если там другой col в таблице, например, имя, адрес электронной почты и т. Д., Вы получите эту ошибку. –

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