2015-11-24 3 views
3

Я использовал столбец в выражении case, и он отлично работал на сервере1. Когда я запускал его на сервере2, он терпел неудачу, потому что столбец имел в нем значение «false».Как безопасно преобразовать varchar (255) в int?

Столбец является varchar (255), но в моем выражении я использовал его, как если бы это был тип INT. Он работал нормально, но теперь он терпит неудачу из-за «ложного» значения в server2.

Как можно безопасно преобразовать в INT, и если преобразование не может быть, по умолчанию 0.

Возможно ли это?

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

UPDATE t1 
    set 
      c1 = ISNULL(
        (
         SELECT CASE c2 
          WHEN 123 then 'hello' 
          WHEN 234 then 'bye' 
          ELSE '' 
         END 
        ) 
       , '') 
FROM table1 as t1 
+0

Хммм ... ваша инструкция 'SELECT CASE' не соответствует правильному синтаксису. Вам нужно удалить 'SELECT' и либо добавить выражение после' CASE' (перед 'WHEN'), либо заменить 123/234 на булевые выражения. –

+0

@JulienBlanchard Я обновил свое сообщение. Он отлично работает, только когда значение c2 не является числовым, тогда неявный листинг терпит неудачу. –

ответ

4

Есть немало способов преобразования из numeric в varchar, но ни один из них не доступен для вас (на самом деле, SQLServer2008 разочаровывает, потому что ему не хватает всего нескольких интересных функций, которые почти требуются).

В вашем случае, лучший способ сделать это просто преобразовать числовое выражение VARCHAR следующим образом:

UPDATE t1 
    set c1 = CASE c2 
     WHEN '123' then 'hello' 
     WHEN '234' then 'bye' 
     ELSE '' 
    END  
FROM @t1 t1 

Это не дает ответа на вопрос, но он решает вашу проблему.

+0

Я перехожу из varchar в INT –

+0

Я знаю, что вы пытаетесь преобразовать из 'varchar' в' numeric', но это далеко не надежное в SQL2008, поэтому я предлагаю вам делайте противоположное и сравнивайте их как 'varchar'. Учитывая ваш пример, преобразование в числовое значение является просто ошибкой. На самом деле, существует очень мало причин для преобразования в числовые значения за пределами арифметических манипуляций ('+', '-',' * 'и т. Д.), –

2

Использование TRY_PARSE (SQL Server 2012+):

SELECT ISNULL(TRY_PARSE(column_name AS INT),0) 
FROM your_table; 

LiveDemo

+2

Использование isnumeric может все еще вызвать проблемы, например '-' является числовым в соответствии с ним –

+0

выглядит так, как будто у меня нет 2012 года, говорит, что функция не существует. –

+1

@JamesZ Это не проблема, 'SELECT CAST ('-' AS INT); - 0' – lad2025

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