2014-01-23 72 views
1

我有一個命名視圖「FechasFirmaHorometros」定義爲爲什麼YEAR會因日期轉換錯誤而失敗?

SELECT IdFormulario, 
     CONVERT(Date, RValues) AS FechaFirma 
FROM dbo.Respuestas 
WHERE (IdPreguntas IN (SELECT IdPregunta 
         FROM dbo.Preguntas 
         WHERE 
     (FormIdentifier = dbo.IdFormularioHorometros()) 
     AND (Label = 'SLFYHDLR'))) 

,我有一個名爲函數[RespuestaPreguntaHorometrosFecha]定義爲

SELECT Respuestas.RValues 
FROM Respuestas 
     JOIN Preguntas 
     ON Preguntas.Label = @LabelPregunta 
     JOIN FechasFirmaHorometros 
     ON FechasFirmaHorometros.IdFormulario = Respuestas.IdFormulario 
WHERE Respuestas.IdPreguntas = Preguntas.IdPregunta 
     AND YEAR(FechasFirmaHorometros.FechaFirma) = @Anio 
     AND MONTH(FechasFirmaHorometros.FechaFirma) = @Mes 

@LabelPregunta VARCHAR(MAX) 
@Anio INT 
@Mes INT 

我一直在命中上述功能的同時調試另一個收到此消息使用它的存儲過程

Conversion failed when converting date and/or time from character string. 

然而,我可以自由地做像

SELECT DAY(FechaFirma) FROM FechasFirmaHorometros 

爲什麼會發生這種情況,我該如何解決或解決它?

+0

這可能是我的想象,但你似乎正在調用一個函數IdFormularioHorometros(),並描述另一個函數RespuestaPreguntaHorometrosFecha。 –

+0

IdFormularioHorometros()是用於定義視圖的函數,僅此而已。 RespuestaPreguntaHorometrosFecha是我在第二塊中描述的那個,有問題的那個 – Machinarius

+1

@DanBracuk函數'RespuestaPreguntaHorometrosFecha'使用視圖'FechasFirmaHorometros',並且該視圖使用函數'IdFormularioHorometros'。錯誤發生在函數'RespuestaPreguntaHorometrosFecha'中,該函數間接使用函數'IdFormularioHorometros'。 –

回答

5

我認爲RValues是某種類型的字符串列,出於某種原因。您應該使用日期數據類型修復該問題並存儲日期數據(顯然,該數據類型不在此混合包中)。

如果不能修復,那麼你就可以預防我們上述達米安:

CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma 

(這將使「日期」 NULL如果SQL Server無法弄清楚如何將它轉換)

只是通過添加WHERE子句,您無法防止此問題,因爲在執行過濾器(全部取決於計劃)之前,SQL Server經常嘗試嘗試執行SELECT列表中的轉換。您也無法使用子查詢,CTE,連接順序提示等強制操作順序。There is an open Connect item about this issue - they are "aware of it" and "hope to address it in a future version。「

缺少CASE表達式,這會強制SQL Server在嘗試執行之前計算ISDATE()結果轉換(as long as no aggregates are present in any of the branches),你可以:

  • 轉儲過濾後的結果爲#TEMP表,並隨後從該#TEMP表中選擇的,只有應用轉換,然後
  • 剛剛返回字符串,和。將它作爲客戶端的日期,並將年份/月份等部分從其中取出
  • 只使用字符串操作來拉YEAR = LEFT(COL,4)等
  • 使用TRY_CONVERT()因爲我只注意到你的SQL Server 2012:

    TRY_CONVERT(DATE, RValues) AS FechaFirma 
    
+0

你有沒有關於這個問題的連接問題,答案也應該鏈接到? –

+0

我認爲它應該工作,會嘗試一下。謝謝 – Machinarius

+0

@Damien也許[這一個](http://connect.microsoft.com/SQLServer/feedback/details/361704/sql-processes-where-clause-items-out-of-order-causing-an-error) ?對於聚合的例外情況,請參閱http://connect.microsoft.com/SQLServer/feedback/details/690017/ http://connect.microsoft.com/SQLServer/feedback/details/649957/ http://connect.microsoft .com/SQLServer/feedback/details/691535/ –

相關問題