Преобразование типа данных varchar в числовой - PullRequest
0 голосов
/ 07 мая 2010

Сообщение 8114, уровень 16, состояние 5, процедура spGetDetails, строка 88
Ошибка преобразования типа данных varchar в числовой.

Я уже преобразовал этот @mfr_id в тип int, затем также получаю вышеуказанную ошибку.

Я получаю ошибку при выполнении хранимой процедуры.

Строка, которую я получаю сообщение об ошибке:

if(@mfr_id = 5)

Ответы [ 3 ]

2 голосов
/ 07 мая 2010

Использование:

if(@mfr_id = '5')

Сравнения значений должны быть одного типа данных или должно быть неявное преобразование типа данных.Явное преобразование - когда вы используете CAST / CONVERT - идеально подходит для обслуживания, поскольку операция очевидна.

В зависимости от ваших потребностей, функция ISNUMERIC может помочь.И будьте осторожны, чтобы определить длину ваших [n] переменных varchar.

1 голос
/ 07 мая 2010

Обновленный ответ

Так что, похоже, @mfr_id - это varchar.Чтобы избежать синтаксической проблемы, используйте ответ в посте OMG Ponies.

Но вы также говорите, что он хранит строку «1 2, 3, 4 .....».Итак, семантически вы хотите, чтобы оператор IF был истинным, если он содержит значение «5»?

Если это так, то вам может понадобиться что-то вроде этого

set @mfr_id = REPLACE(@mfr_id, ' ','')
if ((@mfr_id LIKE '5,%') OR (@mfr_id LIKE '%,5,%') OR (@mfr_id LIKE '%,5'))

Оригинальный ответ - устарел

if(CONVERT(int, @mfr_id) = 5)

, надо надеяться.Подробнее см. http://msdn.microsoft.com/en-us/library/ms187928.aspx.Хотя на самом деле я думаю, что это должно быть неявно преобразовано.Каково значение @mfr_id?Это должно сказать вам это в сообщении об ошибке, я думаю.

0 голосов
/ 07 мая 2010

Этот ответ написан с использованием синтаксиса Oracle PL / SQL и одной из процедур регулярных выражений Oracle. Я не знаю T-SQL достаточно хорошо, чтобы расшифровать его, но я ожидаю, что аналогичные возможности доступны:

FOR aRow IN
  (WITH DATA AS (SELECT @mfg_id AS S FROM DUAL)
     SELECT REGEXP_SUBSTR(S, '[^ ,]+', 1, LEVEL) AS NUM_STRING
       FROM DATA
       CONNECT BY LEVEL < LENGTH(S) - LENGTH(REGEXP_REPLACE(S, '[ ,]', '')))
LOOP
  IF aRow.NUM_STRING = '5' THEN
    NULL;  -- do something appropriate here
  END IF;
END LOOP;

Делись и наслаждайся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...