2015-06-23 6 views
-1

Мне нужна помощь с чем-то, что я не совсем уверен, как решить.преобразование varchar в Int SQL SERVER

Это мой код:

SELECT DISTINCT 

Nr_of_Times_Cust_No_Appears=CASE WHEN CAST(a.TV_Code AS Int)-CAST(BB_Code AS Int)=0 THEN COUNT(*) OVER (PARTITION BY BB_Code) ELSE 'Not same' END 
FROM table 

В принципе, приведенный выше код предназначен, чтобы убедиться, что вычитание ТВ кодекса и BB код равен нулю (0), если нет, то «Не Same». ТВ-код и BB-код - оба varchar, которые являются CAST-Int. Проблема заключается в том, что ELSE «НЕ ТАКОЙ».

Это выход я получаю от SQL Server Management Studio:

Conversion failed when converting the varchar value 'Not same' to data type int. 

Что я должен сделать, чтобы заставить его работать?

ОБНОВЛЕНИЕ: Я наконец нашел обходное решение.

CAST(COUNT(*) OVER (PARTITION BY XX) AS Varchar)..... Это сработало !!!!

+0

Но почему вы храните значения int как char (или какой тип данных он есть)? Целочисленные значения должны храниться в целых столбцах. – jarlh

+0

Ответ указан в ошибке. Вы не можете преобразовать «Не то же самое» в int – Matt

ответ

1

Ошибка возникает только в том случае, если столбец назначения может иметь только один тип данных.

Первая часть вашего CASE утверждения effictively установки типа столбца ожидать целое число, так что, когда вы попали в раздел ELSE и попытаться вставить Not Same, вы получаете сообщение об ошибке.

Пример:

SELECT Num 
INTO #T 
FROM (SELECT '1' AS Num 
      UNION 
      SELECT '2' 
     ) AS val 

SELECT CASE WHEN Num = '1' THEN CAST(Num AS INT) 
      ELSE 'Not 1' 
     END AS OutputVal 
FROM #T 

DROP TABLE #T 

дает вам:

Конверсия удалось при преобразовании значения VARCHAR '1' Не для типа данных Int.

Так что вам нужно вставить приемлемое значение, которое может быть NULL:

Пример:

SELECT Num 
INTO #T 
FROM (SELECT '1' AS Num 
      UNION 
      SELECT '2' 
     ) AS val 

SELECT CASE WHEN Num = '1' THEN CAST(Num AS INT) 
      ELSE NULL 
     END AS OutputVal 
FROM #T 

DROP TABLE #T 
1

Проверьте переменную Nr_of_Times_Cust_No_Appears. Кажется, это int, но вы пытаетесь установить его «Не так».

+0

Я думаю, что, поскольку я делаю вычитание после CASTING varchar TV & BB Codes, сообщение ELSE должно быть также в «int». Я пытался это сделать, и это работает.Я думал, что «Не так» будет лучшим сообщением об ошибке, чем число Дьявола, 6666666666666666666666. Haha – user3197575

+0

«Правильный» способ сделать это - использовать число, которое 'count (*)' не может вернуться. Поскольку вы должны получить хотя бы одну строку для сравнения, 'count (*)' не будет возвращать «null», так почему бы не использовать это? Затем вы можете легко проверить, не соответствует ли ваш столбец 'Nr_of_Times_Cust_No_Appears'' null ', когда вы используете результаты в другом месте, и отобразите соответствующее сообщение об ошибке. Это или бросить ваш 'count' на' varchar' ... –

2

Это происходит потому, что выход вашего сазе возвращает количество () (целое) от THEN 'Не то же самое' (строка) из ELSE. Они должны быть одного типа. Если вы нажмете свой счет () на строку, все будет в порядке.

SELECT DISTINCT Nr_of_Times_Cust_No_Appears= 
     CASE WHEN CAST(a.TV_Code AS Int)-CAST(BB_Code AS Int)=0 
      THEN CAST(COUNT(*) OVER (PARTITION BY BB_Code) AS VARCHAR) 
      ELSE 'Not same' 
      END 
FROM table 

Альтернатива:

SELECT DISTINCT Nr_of_Times_Cust_No_Appears= 
     CASE WHEN CAST(a.TV_Code AS Int)-CAST(BB_Code AS Int)=0 
      THEN COUNT(*) OVER (PARTITION BY BB_Code) 
      ELSE -1 
      END 
FROM table 

В потребляющего кода т.е. интерфейса пользователя, если Nr_of_Times_Cust_No_Appears < 0, то показать 'Не то же самое'!

+0

Спасибо за пример. Он запрашивает сообщение об ошибке с превышением. – user3197575

+0

@ user3197575 См. Измененный пример или альтернативу. – sarin

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