0

注意:下面显示的患者数据是我编造的“虚拟”数据。这不是实际患者的实际信息。

我有一个函数,其中包含以下转换:

Declare @bdate date 
set @bdate =  CONVERT ( date , left(@dob,8) , 112 )

如果我只是在查询窗口中运行它,它会很好地转换日期

select CONVERT(date, left('19900101', 8), 112)  //returns a good date

但是,如果我在 Visual Studio 中单步执行具有相同代码的标量函数,则会出现错误...

Declare @bdate date 
set @bdate =  CONVERT ( date , left(@pidPatientDob,8) , 112 )

抛出...

运行 [dbo].[getAgeAtTestDate] (@obxTestDate = '20120101', @pidPatientDob = '19900101')。

从字符串转换日期和/或时间时转换失败。不存在数据时尝试读取无效。

为什么它在查询窗口中起作用而在函数中不起作用?似乎参数在函数中被正确填充。

这是函数的全文,它返回null(我认为是因为错误)

ALTER FUNCTION [dbo].[getAgeAtTestDate] 
(
    -- Add the parameters for the function here
    @obxTestDate as nvarchar(50), @pidPatientDob as nvarchar(50)
)
RETURNS int
AS
BEGIN
    Declare @bdate date 
    set @bdate =  CONVERT ( date , left(@pidPatientDob,8) , 112 )

    Declare @testDate date 
    set @testDate =  CONVERT ( date , left(@testDate,8) , 112 )

    -- Return the result of the function
    RETURN datediff(mm,  @testDate, @bdate)
END
4

1 回答 1

2

您的参数称为obxTestDate,而不是testDate,因此更改;

set @testDate =  CONVERT ( date , left(@testDate,8) , 112 )

进入

set @testDate =  CONVERT ( date , left(@obxTestDate,8) , 112 )

事情会变得更好。

作为旁注,我认为您也颠倒了DATEDIFF,开始日期应该在结束日期之前;

RETURN datediff(mm,  @bdate, @testDate)
于 2013-02-21T20:36:11.290 回答