在Microsoft SQL Server Management Studio中,我创建了一个用户定义的函数,用于根据用户输入的出生日期计算员工的年龄,如下所示:
USE [Northwind];
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION udf_GetEmployeeAge_test2
(
@DateOfBirth datetime
)
RETURNS int
AS
BEGIN
DECLARE @Age int
SELECT @Age = DATEDIFF(DAY, @DateOfBirth, GETDATE())
RETURN @Age
END
我使用流行的样本Northwind数据库,现在我似乎无法弄清楚的是我如何以及在哪里包含select语句来返回每个员工姓名(FirstName),
姓氏(姓氏),
出生日期(BirthDate)
和age然后还将Select语句包装在存储过程(usp_EmployeeAges)中。
这些列的信息位于名为dbo.Employees
的表中答案 0 :(得分:0)
通过切换到使用内联表值函数而不是标量值函数来提高性能。
而不是创建带有return
子句的标量UDF,如:
return @Age
使用return
子句创建内联表值UDF,如:
return select Age = <expression>
在查询中,而不是:
age = dbo.udf_GetEmployeeAge(col1)
使用:
age = (select age from dbo.udf_GetEmployeeAge(col1))
年龄的内联表值UDF示例:
create function dbo.udf_GetEmployeeAge (@DateOfBirth datetime)
returns table as return
select Age = (convert(int,convert(char(8),getdate(),112))
-convert(char(8),@DateOfBirth,112)
) / 10000;
go
select *
, Age=(select Age from dbo.udf_GetEmployeeAge(Birth_Date))
from pilots
在rextester上进行测试设置:http://rextester.com/CDAEI21728
要在存储过程中使用它,您可以像在查询中一样使用它。
create procedure dbo.get_Pilots_WithAge (@id int) as
begin
select *
, Age=(select Age from dbo.udf_GetEmployeeAge(Birth_Date))
from pilots
where id = @id;
end;
go
exec dbo.get_Pilots_WithAge @id=1;
参考: