2016-03-30 2 views
0

Люди, я прочитал исправления для этой проблемы, но у меня есть вариант, который я не могу решить.Ошибка SQL Select Case Conversion не удалось при преобразовании значения varchar в тип данных int.

Во-первых, следующий синтаксис бросает ошибку

Case 
    when #TFs.lTFID = 1161165 then REPLACE(CONVERT(VARCHAR(11), cast([dCreatedUTC] as datetime), 106), ' ', '-') 
    when #TFs.lTFID = 1161166 then 'Administrator' 
    when #TFs.lTFID = 1161167 then '' 
    when #TFs.lTFID = 1161168 then AssetID 
    when #TFs.lTFID = 1161169 then '' 
    when #TFs.lTFID = 1161170 then '' 
    when #TFs.lTFID = 1161172 then '' 
    when #TFs.lTFID = 1161173 then '' 
    else CAST(#TFs.lTFID as varchar(20)) 
    End 'Value' 

Если я комментирую все, кроме одного из «когда» линии, как показано ниже он работает.

Case 
    when #TFs.lTFID = 1161165 then REPLACE(CONVERT(VARCHAR(11), cast([dCreatedUTC] as datetime), 106), ' ', '-') 
/* when #TFs.lTFID = 1161166 then 'Administrator' 
    when #TFs.lTFID = 1161167 then '' 
    when #TFs.lTFID = 1161168 then AssetID 
    when #TFs.lTFID = 1161169 then '' 
    when #TFs.lTFID = 1161170 then '' 
    when #TFs.lTFID = 1161172 then '' 
    when #TFs.lTFID = 1161173 then ''*/ 
    else CAST(#TFs.lTFID as varchar(20)) 
    End 'Value' 

Любые мысли о том, как я могу отформатировать этот запрос так, чтобы все «случаи» работали?

+0

Что такое тип данных вашего 'столбца AssetID' в таблице ?? –

+0

Какое сообщение об ошибке вы получаете? – AKS

+0

Если ваш 'AssetID' является * численным * типом данных (' int', 'decimal' и т. Д.), Вам нужно будет также использовать' CAST (AssetID AS VARCHAR (n)) 'на нем (например, dCreatedUTC'), так что каждое предложение WHEN возвращает один и тот же тип данных в выражение 'CASE' –

ответ

1

Основываясь на сообщении об ошибке, результатом CASE выражений преобразуется в INT. Также возвращаемое значение вашего WHEN s известно как VARCHAR, за исключением AssetID, поэтому я предполагаю, что это должно быть значение INT.

Ошибка возникает, поскольку при использовании выражения CASE все возвращаемые значения должны быть одного типа данных. Если у них разные типы данных, все значения преобразуются в тип с более высоким значением data type precedence.

И поскольку INT имеет более высокий приоритет, чем VARCHAR, результаты преобразуются в INT, что вызвало ошибку. Чтобы исправить это, вы должны преобразовать AssetID в VARCHAR(n) также

Case 
    when #TFs.lTFID = 1161165 then REPLACE(CONVERT(VARCHAR(11), cast([dCreatedUTC] as datetime), 106), ' ', '-') 
    when #TFs.lTFID = 1161166 then 'Administrator' 
    when #TFs.lTFID = 1161167 then '' 
    when #TFs.lTFID = 1161168 then CAST(AssetID AS VARCHAR(20)) 
    when #TFs.lTFID = 1161169 then '' 
    when #TFs.lTFID = 1161170 then '' 
    when #TFs.lTFID = 1161172 then '' 
    when #TFs.lTFID = 1161173 then '' 
    else CAST(#TFs.lTFID as varchar(20)) 
End 'Value' 
0

Попробуйте

Case #TFs.lTFID 
When 1161165 then REPLACE(CONVERT(VARCHAR(11), cast([dCreatedUTC] as datetime), 106), ' ', '-') 
When 1161166 then 'Administrator' 
. 
. 
. 
Else CAST(#TFs.lTFID as varchar(20)) END 
-2

Поместите CAST вне в CASE следующим образом:

 CAST(
      Case 
       when #TFs.lTFID = 1161165 then REPLACE(CONVERT(VARCHAR(11), cast([dCreatedUTC] as datetime), 106), ' ', '-') 
       when #TFs.lTFID = 1161166 then 'Administrator' 
       when #TFs.lTFID = 1161167 then '' 
       when #TFs.lTFID = 1161168 then AssetID 
       when #TFs.lTFID = 1161169 then '' 
       when #TFs.lTFID = 1161170 then '' 
       when #TFs.lTFID = 1161172 then '' 
       when #TFs.lTFID = 1161173 then '' 
       else #TFs.lTFID 
       End 
     as varchar(20)) 'Value' 
+0

Если AssetID является Integer, то это все равно вернет ту же ошибку. –

1

Try и бросил AssetID к VARCHAR в случае заявления.

Case 
    when #TFs.lTFID = 1161165 then REPLACE(CONVERT(VARCHAR(11), cast([dCreatedUTC] as datetime), 106), ' ', '-') 
    when #TFs.lTFID = 1161166 then 'Administrator' 
    when #TFs.lTFID = 1161167 then '' 
    when #TFs.lTFID = 1161168 then CAST(AssetID AS VARCHAR(20)) 
    when #TFs.lTFID = 1161169 then '' 
    when #TFs.lTFID = 1161170 then '' 
    when #TFs.lTFID = 1161172 then '' 
    when #TFs.lTFID = 1161173 then '' 
    else CAST(#TFs.lTFID as varchar(20)) 
    End 'Value' 
+0

Спасибо, Шон. Для Амита Сукралии я должен был уточнить свой вопрос. сообщение об ошибке находится в теме «Ошибка конверсии при преобразовании значения varchar в тип данных int». Однако я должен был быть более явным. Исходная ошибка: «Ошибка конверсии при преобразовании значения varchar 2016-03-31» в тип данных int. Это то, что меня бросало, поскольку я не фокусировался на AssetID, поскольку он уже был int, и я не верил он должен быть включенным. Кроме того, ответ Феликса Памиттана технически корректен, но пока я не увидел ошибку в своем коде, я действительно не понял ответ. – Andye