2016-02-19 55 views
1

我有一个下面的转换错误将varchar值“2016十月”转换为 int数据类型时SQL:错误转换VARCHAR到int

转换失败。

在下面的语句:

declare @month varchar(20) = 'October' 
select HolidayName, Holiday 
from tblHoliday 
where PortfolioID = 2 and DATEPART(Year, Holiday) = case when @month is null then 2016 else convert(varchar,2016) + '-' + @Month end 

我在做什么错的,什么是做这样的事情的正确方法?

+0

什么是你想做? – bri

+0

从['case'](https://msdn.microsoft.com/en-us/library/ms181765.aspx)表达式返回的各种值必须都是兼容的数据类型,即相同或相同的隐式转换被支持。不幸的是,你对整数和字符串的选择是不兼容的。请注意'VarChar'的默认长度是'1'。您可能需要指定较大的内容,例如'VARCHAR(4)'。 – HABO

回答

0

我猜你要存档:

您的方案

  1. 如果@month is null - >在2016年
  2. 搜索所有值
  3. 如果@month is not null - >搜索所有值随月份和年份

您的问题:

  1. @month is not null,您的查询将是:

    ... and DATEPART(Year, Holiday) = convert(varchar,2016) + '-' @Month 这是整数和varchar

  2. 之间比较有一个在功能上没有建立TSQL,让您将月份名称直接转换为整数,因此解决方法是:

    SELECT DATEPART(MM, @month + '01 2000')

  3. 因此,我建议使用我不认为使用case...when...then,因为它在每个场景中的不同进行比较会在这里工作if...else

代码示例

declare @month varchar(20) = 'October' 
if @month is null begin 
    select HolidayName, Holiday 
    from tblHoliday 
    where PortfolioID = 2 
    and DATEPART(Year, Holiday) = 2016 
end 
else begin 
    select HolidayName, Holiday 
    from tblHoliday 
    where PortfolioID = 2 
    and DATEPART(Year, Holiday) = 2016 
    and DATEPART(Month, Holiday) = DATEPART(MM, @month + '01 2000') 
end 
0

问题是

DATEPART(Year, Holiday) = case when @month is null then 2016 else convert(varchar,2016) + '-' + @Month end 

日期部分(年,节日)为您提供了一个整数值,但情况下,当返回一个整数或字符串。在你的声明2016不能被评估为“2016十一”