无法返回T-SQL标量函数中的顶级记录

时间:2015-01-27 23:44:24

标签: sql sql-server tsql

这是我的功能,应该返回记录的第一行:

ALTER FUNCTION [dbo].[fn_PAT_LastTS] 
(
    -- Add the parameters for the function here
    @PATcode varchar(50)
)
RETURNS datetime
AS
BEGIN
    -- Declare the return variable here
    DECLARE @lastTS datetime

    -- Add the T-SQL statements to compute the return value here
    SET @lastTS = (select top 1 tsdate from timesheet where pat = @PATcode order by tsdate desc)

    -- Return the result of the function
    RETURN @lastTS

END

由于某种原因,它总是返回所有记录而不是顶层记录。是' Top'在T-SQL标量函数中工作吗?

编辑1:这就是我调用函数的方式。

select dbo.fn_PAT_LastTS('ZZ793843') from timesheet

编辑:添加了返回数据的图片,显示多行而不是前1行。enter image description here

3 个答案:

答案 0 :(得分:2)

试试这个:

SELECT TOP 1 @lastTS = tsdate FROM timesheet WHERE pat = @PATcode ORDER BY tsdate DESC

编辑:

问题在于您如何调用该功能:

SELECT dbo.fn_PAT_LastTS('ZZ793843') FROM timesheet

这将从timesheet中选择所有行,其中一列的值为dbo.fn_PAT_LastTS('ZZ793843')的结果。你应该这样称呼它:

SELECT * FROM timesheet WHERE tsdate = dbo.fn_PAT_LastTS('ZZ793843')

OR

SELECT dbo.fn_PAT_LastTS('ZZ793843')

答案 1 :(得分:2)

正在为时间表中的每一行调用标量。

尝试以下方法:

select dbo.fn_PAT_LastTS('ZZ793843')

答案 2 :(得分:2)

只需使用以下内容即可简化整个过程:

select max(tsdate) as tsdate 
from timesheet 
where pat = @PATcode