Преобразование значения nvarchar "0854697543" переполнило столбец int в команде select - PullRequest
3 голосов
/ 17 ноября 2011

У меня есть команда выбора, и она возвращает записи ответов, но также выдает ошибку в конструкторе запросов Visual Studio 2010 с этим запросом:

SELECT  *
FROM    Orders
WHERE   (BCode = 025) AND (Date BETWEEN '1390%' AND '1391%') OR
        (Date BETWEEN '1390%' AND '1391%') AND (MCode = 0123456789)

Ошибка:

Сообщение об ошибке: преобразование значения nvarchar "0854697543"
переполнило столбец int

Типы данных:

BCode : nvarchar(50)
Date :  nvarchar(50)
MCode : nvarchar(10)

В чем проблема?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Не должно ли быть

AND (MCode = '0123456789')

В противном случае он попытается использовать 0123456789 в качестве целого числа, что приведет к ошибке преобразования.

Кроме того, вы повторяете себя в логике (Date BETWEEN...), более кратко:

WHERE   (Date BETWEEN '1390%' AND '1391%') AND
        ((BCode = 025) OR (MCode = '0123456789'))
1 голос
/ 17 ноября 2011

Мне кажется, я понимаю, в чем проблема: вы сравниваете MCode (который nvarchar) с целочисленным значением (0123456789) в вашем запросе, поэтому движок пытается преобразовать ваше поле в intза каждую запись !!Попробуйте это

SELECT  *
FROM    Orders
WHERE   (BCode = '025') AND 
        (LEFT(Date, 4) = '1390' OR LEFT(Date, 4) = '1391') AND 
        (MCode = '0123456789')

Как я уже сказал в своем комментарии: не используйте nvarchar(50) для хранения дат !!Используйте соответствующий тип данных (например, DateTime или Date) для каждого столбца: это позволит избежать головной боли в будущем, упростит проектирование запроса и действительно ускорит его выполнение!

...