O que é uma Function no SqlServer ?
Uma função definida pelo usuário é uma rotina Transact-SQL ou CLR (Common Language Runtime) que aceita parâmetros, executa uma ação, como um cálculo complexo, e retorna o resultado dessa ação como um valor. O valor de retorno pode ser um valor escalar (único) ou uma tabela. Use essa instrução para criar uma rotina reutilizável que possa ser usada destas maneiras:
- Em instruções Transact-SQL, como SELECT
- Em aplicativos que chamam a função
- Na definição de outra função definida pelo usuário
- Para parametrizar uma exibição ou aprimorar a funcionalidade de uma exibição indexada
- Para definir uma coluna em uma tabela
- Para definir uma restrição CHECK em uma coluna
- Para substituir um procedimento armazenado
- Usar uma função embutida como um predicado de filtro para uma política de segurança
Exemplo de uma Function que Calcula Dias Úteis:
CREATE FUNCTION [dbo].[FNIC_QUANTIDADES_DIAS_UTEIS]
(
@StartDate SMALLdatetime,
@EndDate SMALLdatetime
)
RETURNS INT
AS
BEGIN
/***********************************************************************/
— RETORNA A QUANTIDADE DE DIAS UTEIS EM UM PERIODO
— DESCONSIDERA SABADOS, DOMINGOS E FERIADOS EM DBIC03.dbo.rel_feriados
— A HORA NAO EH CONSIDERADA NA CONTAGEM DOS DIAS
/***********************************************************************/
DECLARE @DayofWeek smallint,
@RESULTADO INT
–============================================================================================
— REMOVE AS HORAS DA DATA, DEIXANDO NO FORMATO YYYYMMDD
–============================================================================================
SET @StartDate = Convert(SMALLDATETIME, Convert(VARCHAR, @StartDate, 112))
SET @EndDate = Convert(SMALLDATETIME, Convert(VARCHAR, @EndDate, 112))
–============================================================================================
SET @DayofWeek = datepart(dw, @StartDate)
DECLARE @datas TABLE ( dt_ini smalldatetime, dt_fim smalldatetime, DayofWeek smallint )
INSERT @datas VALUES (@StartDate, @EndDate, @DayofWeek)
–============================================================================================
WHILE @EndDate > @StartDate
BEGIN
SELECT @StartDate = dateadd(dd, 1, @StartDate), @DayofWeek = datepart(dw, @StartDate)
INSERT @datas VALUES (@StartDate, @EndDate, @DayofWeek)
END
–============================================================================================
SELECT
@RESULTADO = COUNT(t1.dt_ini)
FROM
@datas t1
WHERE
DayofWeek NOT IN (7,1)
AND t1.dt_ini NOT IN ( SELECT dt_feriado
FROM DBIC03.dbo.rel_feriados t2 )
–============================================================================================
RETURN(@RESULTADO)
END
Referências: