需要在用户定义的函数中包含列并将其存储在过程中
Posted
技术标签:
【中文标题】需要在用户定义的函数中包含列并将其存储在过程中【英文标题】:Need to include columns in a user defined function and store it in a procedure 【发布时间】:2017-01-22 14:11:36 【问题描述】:在 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)
和年龄,然后还将 Select 语句包装在存储过程 (usp_EmployeeAges) 中。
这些列的信息位于名为 dbo.Employees 的表中
【问题讨论】:
select name,surname,BirthDate,Age=dbo.udf_GetEmployeeAge_test2(BirthDate) from yourtable
但年龄计算不正确
使用这个FLOOR((CAST (GetDate() AS INTEGER) - CAST(BirthDateAS INTEGER)) / 365.25)
来计算年龄。检查这个问题How to calculate age (in years) based on Date of Birth and getDate()
【参考方案1】:
通过改用内联表值函数而不是标量值函数来提高性能。
而不是使用 return
子句创建标量 UDF,例如:
return @Age
使用 return
子句创建内联表值 UDF,例如:
return select Age = <expression>
在查询中,而不是:
age = dbo.udf_GetEmployeeAge(col1)
用途:
age = (select age from dbo.udf_GetEmployeeAge(col1))
Age 的内联表值 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;
参考:
inline scalar functions - Itzik Ben-Gan Scalar functions, inlining, and performance: An entertaining title for a boring post - Adam Machanic【讨论】:
以上是关于需要在用户定义的函数中包含列并将其存储在过程中的主要内容,如果未能解决你的问题,请参考以下文章