Преобразование хранимой процедуры в пользовательскую функцию - PullRequest
0 голосов
/ 16 августа 2010

Мне нужна помощь в преобразовании хранимой процедуры в функцию,

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 

Возвращаемое значение функции должно быть [Количество дней, месяцев и лет между двумя датами]

например:

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

Ответы [ 2 ]

1 голос
/ 16 августа 2010

Довольно просто:

  1. Изменить CREATE PROCEDURE на CREATE FUNCTION.
  2. Добавьте тип данных возврата после входных параметров, поэтому @todate DATETIME) становится @todate DATETIME) RETURNS VARCHAR(255).
  3. Измените ваш последний выбор, чтобы вернуть выходное значение - так SELECT @FromDate, @Todate, @TotalYears Yrs, @TotalMonths Mont, @TotalDays Days , @TotalYears + ' years,' + @TotalMonths + ' months,' + @TotalDays+ ' days' становится RETURN @TotalYears + ' years,' + @TotalMonths + ' months,' + @TotalDays+ ' days'.
  4. Функция компиляции.

Теперь вы сможете использовать функцию в операторе выбора - например,

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

должен вернуть '0 лет, 10 месяцев, 6 дней'.

1 голос
/ 16 августа 2010

Вы хотите создать Табличную функцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...