2016-02-19 72 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十一」