Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преобразуването е неуспешно при преобразуване на стойността на varchar в оператора case

Когато използвате CASE оператор, всички резултатни изрази трябва да имат един и същ тип данни. Ако не, резултатът ще бъде преобразуван в типа данни с по-висок приоритет. Според BOL :

От INT има по-висок приоритет на типа данни отколкото VARCHAR , "Weeks" се преобразува в INT и това води до грешката:

Друг пример, който ще доведе до същата грешка:

SELECT CASE WHEN 1 = 1 THEN 'True' ELSE 0 END

Решението е да конвертирате RS.intInterval към VARCHAR :

CONVERT(VARCHAR(10), RS.intInterval)

Последната ви заявка трябва да бъде:

DECLARE @bFlag bit
SET @bFlag = 0
SELECT  something = CASE
                WHEN @bFlag = 1 THEN
                    CASE
                        WHEN RS.intInterval = 1 THEN '"Days"'
                        WHEN RS.intInterval = 2 THEN '"Weeks"'
                        WHEN RS.intInterval = 3 THEN '"Months"'
                        WHEN RS.intInterval = 4 THEN '"Years"'
                    END
                Else 
                    CONVERT(VARCHAR(10), RS.intInterval)
                End
from    MyTable  AS RS WITH (NOLOCK)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Промяна на именувания екземпляр на SQL Server на екземпляр по подразбиране

  2. Проблем с вмъкване на паралелността - многонишкова среда

  3. Как да правите заявки и анализирате йерархията на съседен списък с помощта на cte?

  4. Намерете уникални стойности в колона с текст, разделен със запетая

  5. намерете броя на отворените връзки в базата данни