首页 > 解决方案 > 将数据类型 Int 转换为 Varchar SQL Server 2016

问题描述

我正在使用 SQL Server 2016。我的日期已经是类型varchar(50)。我希望 case 表达式将列创建为Varchar.

但是使用以下语句

Case 
    when task_completed_date is not >= 1 
       Then '1'  
    when SUM(DATEDIFF (DAY, task_started_date, task_completed_date)+1) <= 0 
       Then 'Ongoing'
End

正在引发错误:

将 varchar 值“正在进行”转换为数据类型 int 时转换失败

请帮忙!谢谢

标签: sqlsql-server

解决方案


T-SQL中表达式的返回类型对于所有路径和备选方案都CASE必须相同-您的情况并非如此。

当不同WHEN路径的返回类型不相同时,SQL Server 将尝试将所有返回值转换为通用类型——基于MSDN 中记录的数据类型优先规则。

在这里,INT具有比更高的优先级VARCHAR,因此 SQL Server 正在尝试将所有返回值转换为INT- 很明显,'Ongoing' 并不能很好地转换为INT......

因此,您需要所有可能的返回值从您的返回值转换CASE为有效INT- 或另辟蹊径,使所有返回值VARCHAR

Case 
    when task_completed_date is not >= 1 
       Then CAST('1' AS VARCHAR(5))
    when SUM(DATEDIFF (DAY, task_started_date, task_completed_date)+1) <= 0 
       Then 'Ongoing'
End

推荐阅读