2014-01-23 52 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/ –

相关问题