2017-01-22 2 views
0

Dans Microsoft SQL Server Management Studio j'ai créé une fonction définie par l'utilisateur pour calculer l'âge d'un employé en fonction de la date de naissance, les entrées de l'utilisateur comme suit:Nécessité d'inclure des colonnes dans une fonction définie par l'utilisateur et le stocker dans une procédure

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 

J'utilise l'échantillon populaire base de données Northwind, maintenant la chose que je ne peux pas à comprendre comment et où dois-je inclure une instruction select pour retourner chaque nom de l'employé (FirstName),

nom (Nom),

date de naissance (Bir thDate)

et de vieillir et puis également envelopper l'instruction Select dans une procédure stockée (usp_EmployeeAges).

Les informations relatives à ces colonnes sont dans une table appelée dbo.Employees

+0

'choisir le nom, prénom, date de naissance, âge = dbo.udf_GetEmployeeAge_test2 (BirthDate) de yourtable' mais le calcul de l'âge n'est pas correct –

+0

Utilisez ce 'FLOOR ((CAST (GetDate() AS INTEGER) - CAST (BirthDateAS INTEGER))/365.25) 'pour calculer l'âge. Cochez cette question [Comment calculer l'âge (en années) basé sur Date de naissance et getDate()] (http://stackoverflow.com/questions/1572110/how-to-calculate-age-in-years-based-on -date-de-naissance-et-getdate) –

Répondre

0

Augmentez les performances en passant à l'aide d'une fonction de table inline au lieu d'une fonction d'une valeur scalaire.

Au lieu de créer une UDF scalaire avec une clause return comme:

return @Age 

Créer une UDF table en ligne d'une valeur avec une clause return comme:

return select Age = <expression> 

Dans la requête, au lieu de:

age = dbo.udf_GetEmployeeAge(col1) 

Utilisation:

age = (select age from dbo.udf_GetEmployeeAge(col1)) 

Exemple table en ligne d'une valeur UDF pour Age:

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 

configuration de test sur rextester: http://rextester.com/CDAEI21728


Pour l'utiliser dans une procédure stockée , vous l'utilisez de la même manière que dans une requête.

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; 

Référence: