none
Como converter uma função para view RRS feed

  • Pergunta

  • Boa tarde,

     Tenho a seguinte função:

    if object_id('dbo.batidas', 'TF') is null
    begin
        exec('create function dbo.batidas() returns @retorno table(T int) as begin return end');
    end;
    go
    
    alter function dbo.batidas(@data_inicio date,
                               @data_final date)
    returns @retorno table(chapa varchar(100),
        nome varchar(100),
        filial varchar(100),
        secao varchar(100),
        situacao varchar(100),
        [data 1] date,
        [data 2] date,
        [data 3] date,
        ocorrencia varchar(100))
    as
    begin
        declare @batidas table(filial varchar(100),
            coligada varchar(100),
            chapa varchar(100),
            secao varchar(100),
            situacao varchar(100),
            nome varchar(100),
            data datetime,
            dia varchar(100),
            batida int);
    
        insert into @batidas
            (filial,
            coligada,
            chapa,
            secao,
            situacao,
            nome,
            data,
            dia,
            batida)
        select f.filial,
            f.coligada,
            f.chapa,
            f.secao,
            f.situacao,
            f.nome,
            v.data,
            datename(dw,v.data),
            max(v.sequencialbatida)
        from arelbatidatransitoview as v
            left join vwfunc  as f on v.chapa = f.chapa
        where datepart(dw,v.data) = 1 -- domingo
            and batida is not null
            and v.data between @data_inicio and @data_final
            and v.codcoligada = 1
        group by v.chapa,
                v.data,
                f.filial,
                f.coligada,
                f.chapa,
                f.secao,
                f.funcao,
                f.nome,
                f.situacao;
    
        insert into @retorno
            (chapa,
            nome,
            filial,
            secao,
            situacao,
            [data 1],
            [data 2],
            [data 3],
            ocorrencia)
        select t1.chapa,
            t1.nome,
            t1.filial,
            t1.secao,
            t1.situacao,
            cast(t1.data as date),
            cast(t2.data as date),
            cast(t3.data as date),
            '04 - TESTE DOMINGO'
        from @batidas as t1
            inner join @batidas as t2 on t2.chapa = t1.chapa
            inner join @batidas as t3 on t3.chapa = t1.chapa
        where t2.data = dateadd(day, + 7, t1.data)
            and t3.data = dateadd(day, + 14, t1.data);
    
        return;
    end;
    go


    Eu faço pesquisa nela com a seguinte query:

    SELECT 
    	bat.CHAPA,
    	LEFT(bat.NOME,25)  AS  NOME,
    	bat.FILIAL,
    	bat.SECAO,
    	bat.NSECAO,
    	bat.SITUACAO,
    	bat.[DATA 1],
    	bat.[DATA 2],
    	bat.[DATA 3],
    	bat.OCORRENCIA
    		FROM dbo.batidas(@DTINICIO, @DTFINAL) bat
    		WHERE bat.FILIAL = @LOJA
    		ORDER BY bat.FILIAL,bat.NSECAO,bat.NOME;

    O que gostaria, transformar a query em uma uma view pois assim poderia fazer um join com outras views que tenho para exibir em um painel.

    Só que hoje eu não consigo porque a função precisa de paramentos, e por isso não aceita, alguém poderia me dar uma dica de como fazer ?

    Veja a mensagem quando tento criar uma view da query:

    Com os paramentos na query:

    Msg 137, Nível 15, Estado 2, Procedimento VIEW_MAIS_DOIS_DOMINGOS_SEM_FOLGA, Linha 13 [Linha de Início do Lote 11]
    Must declare the scalar variable "@DTINICIO".
    


    Sem os paramentos na query:

    Msg 216, Nível 16, Estado 1, Procedimento VIEW_MAIS_DOIS_DOMINGOS_SEM_FOLGA, Linha 13 [Linha de Início do Lote 11]
    Parameters were not supplied for the function 'dbo.batidas'.


    • Editado otaciojb segunda-feira, 17 de junho de 2019 18:13 Adicionado mais informações
    segunda-feira, 17 de junho de 2019 18:09

Respostas

  • O que gostaria, transformar a query em uma uma view pois assim poderia fazer um join com outras views que tenho para exibir em um painel.
    Só que hoje eu não consigo porque a função precisa de paramentos, e por isso não aceita, alguém poderia me dar uma dica de como fazer ?

    Otácio, a função que você criou é do tipo multistatement table-valued; ou seja, ela retorna uma tabela. Então, ela pode ser utilizada diretamente em junções. Não é necessário transformá-la em exibição (view).

    A função possui 2 parâmetros: @data_inicio e @data_final. Se você quer que esses parâmetros sejam opcionais, basta alterar o filtro

         and v.data between @data_inicio and @data_final

    para

         and (@data_inicio is null or v.data >= @data_inicio)
         and (@data_final is null or v.data <= @data_final)

    e, na chamada à função, informar NULL nos parâmetros:

         FROM dbo.batidas(NULL, NULL) bat

    Com essa simples alteração a função continua a funcionar como era mas também permitir o uso sem a obrigatoriedade de informar os parâmetros.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José DizModerator terça-feira, 18 de junho de 2019 14:12
    • Marcado como Resposta otaciojb terça-feira, 18 de junho de 2019 19:58
    terça-feira, 18 de junho de 2019 13:38
    Moderador

Todas as Respostas

  • otaciojb,

    Toda e qualquer view não suporta e não permite uso de parâmetros ou variáveis em seu bloco de Código, somente em sua execução.

    Minha sugestão, transforme a function em uma Stored Procedure.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Sugerido como Resposta IgorFKModerator terça-feira, 18 de junho de 2019 12:10
    segunda-feira, 17 de junho de 2019 22:57
  • O que gostaria, transformar a query em uma uma view pois assim poderia fazer um join com outras views que tenho para exibir em um painel.
    Só que hoje eu não consigo porque a função precisa de paramentos, e por isso não aceita, alguém poderia me dar uma dica de como fazer ?

    Otácio, a função que você criou é do tipo multistatement table-valued; ou seja, ela retorna uma tabela. Então, ela pode ser utilizada diretamente em junções. Não é necessário transformá-la em exibição (view).

    A função possui 2 parâmetros: @data_inicio e @data_final. Se você quer que esses parâmetros sejam opcionais, basta alterar o filtro

         and v.data between @data_inicio and @data_final

    para

         and (@data_inicio is null or v.data >= @data_inicio)
         and (@data_final is null or v.data <= @data_final)

    e, na chamada à função, informar NULL nos parâmetros:

         FROM dbo.batidas(NULL, NULL) bat

    Com essa simples alteração a função continua a funcionar como era mas também permitir o uso sem a obrigatoriedade de informar os parâmetros.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José DizModerator terça-feira, 18 de junho de 2019 14:12
    • Marcado como Resposta otaciojb terça-feira, 18 de junho de 2019 19:58
    terça-feira, 18 de junho de 2019 13:38
    Moderador
  • Muito bom obrigado pela ajuda e explicação.
    terça-feira, 18 de junho de 2019 19:58