需要在用户定义的函数中包含列并将其存储在过程中

时间:2017-01-22 14:11:37

标签: sql-server stored-procedures user-defined-functions

在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

的表中

1 个答案:

答案 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;

参考: