Ошибка преобразования TSQL NVARCHAR внутри оператора CASE

Этот выбор сводит меня с ума.
Ошибка:

Ошибка преобразования при преобразовании значения nvarchar «17,30 ч» в тип данных int.

Данные:

(DateTime)   (Nvarchar)  (DateTime)
DATAINICI    DATAMANUAL  DATAFI
null         17.30 h     10/01/2015
01/01/2015   20.30 h     null

И утверждение такое:

CASE WHEN  dbo.Activitat.DataInici is null 
THEN DATEPART(DAY,Activitat.Datafi) 
ELSE CONVERT(NVARCHAR(50), dbo.Activitat.DataManual)
END 

person JoeCool    schedule 27.05.2015    source источник
comment
Где приведение к int?   -  person Giorgi Nakeuri    schedule 27.05.2015
comment
можешь показать все заявление? Вы уверены, что там не работает? Попробуйте закомментировать этот раздел, вы по-прежнему будете получать ту же ошибку?   -  person Giannis Paraskevopoulos    schedule 27.05.2015


Ответы (1)


Вы получаете эту ошибку из-за неявного преобразования. Одна часть CASE возвращает NVARCHAR(50), то есть CONVERT(NVARCHAR(50), dbo.Activitat.DataManual), который не может быть преобразован в int, а другая возвращает int, то есть DATEPART(DAY,Activitat.Datafi).

Что-то подобное также вернет ту же ошибку.

SELECT CASE WHEN 1=2 THEN 1 ELSE 'errorstring' END

Вы должны CONVERT и вернуть NVARCHAR(50) в обоих случаях, чтобы не было неявного преобразования. Что-то вроде этого.

CASE WHEN  dbo.Activitat.DataInici is null 
THEN CONVERT(NVARCHAR(50),DATEPART(DAY,Activitat.Datafi))
ELSE CONVERT(NVARCHAR(50), dbo.Activitat.DataManual)
END 
person ughai    schedule 27.05.2015
comment
Отличный улов. Даже не подумал об этом. - person Giorgi Nakeuri; 27.05.2015
comment
Извините за задержку ughai (месяцы, я знаю). Но наконец-то сделано! - person JoeCool; 15.10.2015