2010-08-16 4 views
0

i besoin d'aide pour la conversion d'une procédure stockée à une fonction,La conversion d'une procédure stockée en fonction définie par l'utilisateur

CREATE PROCEDURE [dbo].[FunGetEmpExp] (@fromdate DATETIME,@todate DATETIME) 
AS 
BEGIN 
    DECLARE @TotalYears VARCHAR(2) 
    DECLARE @TotalMonths VARCHAR(2) 
    DECLARE @TotalDays VARCHAR(2), @Duration varchar(10) 

    SET @TotalYears = null 
    SET @TotalMonths = NULL 
    SET @TotalDays = NULL 
    SET @todate = DATEADD(day,1,@todate) 

    SELECT @TotalYears = CASE WHEN Month(@fromdate) <= Month(@Todate) AND (Day(@fromdate)<=Day(@Todate)) THEN DateDiff(YEAR,@fromdate,@Todate) 
    ELSE DateDiff(YEAR,@fromdate,@Todate) - 1 END 

    SELECT @TotalMonths = CASE WHEN (Day(@fromdate)<=Day(@Todate)) then DateDiff(MONTH,@fromdate,@Todate)- @TotalYears*12 ELSE DateDiff(MONTH,@fromdate,@Todate) - @TotalYears * 12 - 1 END 

    SELECT @TotalDays = DateDiff(DAY,DateAdd(MONTH, CASE WHEN (Day(@fromdate)<=Day(@Todate)) then DateDiff(MONTH,@fromdate,@Todate)-(DateDiff(YEAR,@fromdate,@Todate))*12 

    ELSE DateDiff(MONTH,@fromdate,@Todate)-(DateDiff(YEAR,@fromdate,@Todate))*12-1 end , DateAdd(YEAR,(DateDiff(YEAR,@fromdate,@Todate)),@fromdate)),@Todate) 

    IF (@TotalMonths >= 12) 
    BEGIN 
     SET @TotalYears = @TotalYears + 1 SET @TotalMonths = @TotalMonths - 12 
    END 

    SELECT @FromDate, @Todate, @TotalYears Yrs, @TotalMonths Mont, @TotalDays Days , @TotalYears + ' years,' + @TotalMonths + ' months,' + @TotalDays+ ' days' 
END 

la valeur de retour de la fonction doit être [le nombre de jours, mois et années entre deux dates ]

par exemple:

exec FunGetEmpExp '2010-03-26','2011-01-31' 
Return Value:0 years,10 months,6 days 
+0

Où souhaitez-vous utiliser cette fonction? Généralement, une fonction peut retourner une seule valeur ou, comme l'a dit @Jon, la fonction de valeur de table pourrait être utile dans votre cas. – shahkalpesh

Répondre

1

Vous voulez créer un Table-Valued function

+0

Seulement si user310879 veut retourner toutes les 6 colonnes dans l'instruction de sélection finale - s'il veut seulement la chaîne finale (comme spécifié dans la question), alors une fonction à valeur scalaire serait probablement meilleure. –

+0

C'est vrai, je suis un grand fan de la séparation des données de la présentation si –

1

assez simple:

  1. changement CREATE PROCEDURE-CREATE FUNCTION.
  2. Ajoutez un type de données de retour après les paramètres d'entrée. Par conséquent, @todate DATETIME) devient @todate DATETIME) RETURNS VARCHAR(255).
  3. Modifiez votre sélection finale pour renvoyer la valeur de sortie. Par conséquent, SELECT @FromDate, @Todate, @TotalYears Yrs, @TotalMonths Mont, @TotalDays Days , @TotalYears + ' years,' + @TotalMonths + ' months,' + @TotalDays+ ' days' devient RETURN @TotalYears + ' years,' + @TotalMonths + ' months,' + @TotalDays+ ' days'.
  4. Fonction de compilation.

Vous devriez maintenant pouvoir utiliser la fonction dans une instruction select - par ex.

select [dbo].[FunGetEmpExp]('2010-03-26','2011-01-31') 

devrait retourner '0 ans, 10 mois, 6 jours.

Questions connexes