Estamos novamente aqui com voces,hoje pra falar de mais um assunto da linguagem SQL que sao as FUNCTIONS ouFuncoes. No artigo passado falamos sobre Procedures, as FUNCTIONS sao bemparecidas, pois tambem podem realizar alguns processos, receber parametros, comuma diferenca, as funcoes devolvem um resultado. UtilizacaoPodemos utiliza-las para criarrotinas reutilizaveis das maneiras abaixo:Em instrucoes Transact-SQL, como SELECT;Em aplicativos que chamam a funcao;Na definicao de outra funcao definida pelousuario;Para parametrizar uma exibicao ou aprimorar afuncionalidade de uma exibicao indexada;Para definir uma coluna em uma tabela;Para definir uma restricao CHECK em uma coluna;Para substituir um procedimento armazenado.Sintaxe--Transact-SQL Scalar Function SyntaxCREATE FUNCTION nome_funcao( [ {@nome_parametro [ AS ][ type_schema_name. ] tipo_dado_parametro [ = default ] [ READONLY ] } [ ,...n ] ])RETURNS tipo_dado_retorno [ WITH [ ,...n ] ] [ AS ] BEGIN function_body RETURNscalar_expression END[ ; ]--Transact-SQL Inline Table-Valued FunctionSyntax CREATE FUNCTION [ schema_name. ] nome_funcao( [ {@nome_parametro [ AS ] [ type_schema_name. ] tipo_dado_parametro [ = default ] [ READONLY ] } [ ,...n ] ])RETURNS TABLE [ WITH [ ,...n ] ] [ AS ] RETURN [ ( ]select_stmt [ ) ][ ; ]Instrucoes validasTodas as instrucoes a seguir saovalidas em uma funcao, ou seja, podemos utilizar no interior de uma funcao:Instrucoes de atribuicao.Instrucoes de controle de fluxo com excecao das instrucoes TRY...CATCH.Instrucoes DECLARE que definem variaveis de dados locais e cursores locais.Instrucoes SELECT que contem listas de selecao com expressoes que atribuem valores a variaveis locais.Operacoes de cursor que fazem referencia a cursores locais que sao declaradas, abertas, fechadas e desalocadas na funcao. Apenas instrucoes FETCH que atribuem valores a variaveis locais usando a clausula INTO sao permitidas. Instrucoes FETCH que retornam dados ao cliente nao sao permitidas.Instrucoes INSERT, UPDATE e DELETE que modificam variaveis de tabela locais.Instrucoes EXECUTE que chamam procedimentos armazenados estendidos.Limitacoes e restricoesQuando criamos funcoesnao podemos utiliza-las para modificar o estado do banco, tambem nao podemos usarOUTPUT INTO para retornar para uma tabela.AninhamentoAs funcoes criadas podem seraninhadas, ou seja, utilizar uma dentro de outra, ate o 32o nivel. Caso sejaexcedido esse numero havera uma falha na cadeia inteira de funcoes.ExemplosComecemos a mostrar algunsexemplos de funcoes, vamos iniciar mostrando uma funcao que faz uma coisasimples, uma funcao que mostra o numero da semana, tendo como parametro deentrada uma data especifica;IF OBJECT_ID (N'dbo.NmSemana', N'FN') IS NOT NULL DROP FUNCTIONdbo.NmSemana;GOCREATE FUNCTIONdbo.NmSemana (@DATE datetime)RETURNS intWITH EXECUTEAS CALLERASBEGIN DECLARE@NmSemana int; SET@NmSemana= DATEPART(wk,@DATE)+1 -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104');--Special cases: Jan 1-3 maybelong to the previous year IF (@NmSemana=0) SET@NmSemana=dbo.NmSemana(CAST(DATEPART(yy,@DATE)-1 AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1;--Special case: Dec 29-31may belong to the next year IF ((DATEPART(mm,@DATE)=12) AND ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28)) SET@NmSemana=1; RETURN(@NmSemana);END;GOSET DATEFIRST1;SELECTdbo.NmSemana(CONVERT(DATETIME,'08/14/2013',101)) AS 'Numero da Semana';Agora vamos criar uma funcao pararetornar uma tabela especifica de acordo um o codigo do produto passado.IF OBJECT_ID (N'FNMovimProdutos', N'IF') IS NOT NULL DROP FUNCTIONFNMovimProdutos;GOCREATE FUNCTIONFNMovimProdutos (@codigoint)RETURNS TABLEASRETURN ( SELECTDESC_PRODUTO, QTD_PRODUTO, TP_MOVIMENTO,DTH_MOVIMENTO, SUM(VR_MOVIMENTO) FROM TBPRODUTOP INNER JOIN TBMOVIMENTOPRODUTOM ON M.CD_PRODUTO= P.CD_PRODUTO INNER JOIN TBMOVIMENTODIARIO D ON D.CD_MOVIMENTO = M.CD_MOVIMENTO WHERECD_PRODUTO = @CODIGO GROUP BY CD_PRODUTO,DESC_PRODUTO, QTD_PRODUTO, TP_MOVIMENTO,DTH_MOVIMENTO);GOPara invocar a funcao,execute esta consulta.SELECT *FROM FNMovimProdutos (6);Aqui encerramos mais esse arquivo sobre a linguagem SQL onde mostramos um pouco da utilizacao de FUNCOES, caso tenha