Function – SqlServer

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:

https://msdn.microsoft.com/pt-br/library/ms186755.aspx