2015-12-02 3 views
2

Я совершенно новый в sql-сервере. Я пытаюсь запустить этот запрос:Ошибка SQL Server «Сбой конверсии» при использовании CAST или CONVERT

SELECT AVG(jl.[Stock Weight]) 
    FROM [Settlement Line] jl 
    WHERE jl.[Vendor No_] = 8516 
    AND (jl.[Slaughter Date] BETWEEN '2015-11-01' AND '2015-11-30') 
    AND (CAST(jl.[Item No_] AS INT) BETWEEN 17000 AND 17099) 

В результате, я получаю эту ошибку:

OperationalError: (245, "Conversion failed when converting the varchar value 'PRISGAR.'

Я не могу понять это. Я также не могу понять, что такое PRISGAR. Я пробовал с CONVERT также, получил такую ​​же ошибку. Поле [Item No_] является varchar(20), которое я пытаюсь преобразовать в INT и проверить между двумя номерами.

+1

Не могли бы вы предоставить схему таблиц, чтобы мы могли увидеть, что типа полей, пожалуйста? Это просто ошибка типа. – Dane

+3

Одна строка имеет 'PRISGAR' как значение в поле' [Item No_] '. Это не может быть преобразовано в 'INT' – Raj

+1

. Замечание: [вы не хотите использовать' BETWEEN' для типов даты и времени на SQL Server] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10 /19/what-do-between-and-the-devil-have-in-common.aspx) (или действительно, многое другое). –

ответ

2

Неясно от ошибок, является ли ошибка для [Vendor No_] или [Item No_] или jl.[Stock Weight]. SQL строго типизирован, но делает преобразования типов. Вы должны попытаться выполнить сравнения с использованием одного и того же типа, а не хранить числа в виде строк.

Если проблема в среднем, то вы можете использовать case. Нечто подобное:

SELECT AVG(CASE WHEN ISNUMERIC(jl.[Stock Weight]) = 1 
       THEN CAST(jl.[Stock Weight] as FLOAT) 
      END) 

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

j1.[Vendor No_] = '8516' 

[Item No_] является немного более трудным. Заманчиво написать:

jl.[Item No_] BETWEEN '17000' AND '17099' 

Однако это будет соответствовать «170019991234545», потому что сравнение будет сделано в виде строк, а не чисел. Другим методом является:

(jl.[Item No_] BETWEEN '17000' AND '17099' AND LEN(jl.[Item No_]) = 5) 

Однако, это будет соответствовать «1702A». Еще один может использовать LIKE, чтобы гарантировать, что значения всех цифр:

(jl.[Item No_] BETWEEN '17000' AND '17099' AND 
jl.[Item No_] LIKE '[0-9][0-9][0-9][0-9][0-9]' 
) 

И это может быть упрощена:.

(jl.[Item No_] LIKE '170[0-9][0-9]') 
+0

Был полезен для того, чего я пытался достичь. Благодарю. –

0

Попробуйте это:

SELECT AVG(jl.[Stock Weight]) 
FROM dbo.[Settlement Line] jl 
WHERE jl.[Vendor No_] = 8516 
    AND jl.[Slaughter Date] BETWEEN '20151101' AND '20151130' 
    AND jl.[Item No_] BETWEEN '17000' AND '17099' 
0

Колонка JL [Элемент no_] содержит строку, как где-то. Проверьте все строки и удалите строку из этого столбца, затем используйте вышеуказанный запрос.

0

Вы должны использовать случай выражения (это может заблуждаться для некоторых специальных строк, как, вы можете добавить некоторые дополнительные проверки «»):

case 
    when isnumeric(jl.[Item No_]) = 1 
    then CAST(jl.[Item No_] AS INT) 
    else 0 
end BETWEEN 17000 AND 17099 
Смежные вопросы