locked
Function receber um SQL e retornar um Table RRS feed

  • Pergunta

  • Boa tarde, estou tentando fazer uma função no SQL Server que recebe uma SQL em NVARCAR(500) e retornar uma Table.

    O meu objetivo é analisar o tempo das consultas mais demorar para melhorar o desempenho delas, sem intervir no sistema no primeiro momento.

     

    1)Consigo criar uma function e retornar um Table

    CREATE FUNCTION [fn_Consulta_LOG1] (@sql1 AS NVARCHAR(500))  RETURNS TABLE

    AS RETURN

    (

    Select nome from tabela_cli

    );

    GO

     

    1.1) No teste funciona

    Select * from fn_Consulta_LOG1('');

     

    2) Mais não consigo passar uma consulta por parâmetro para executar dento da Função.

    O que estou fazendo de errado?

    CREATE FUNCTION [fn_Consulta_LOG2] (@sql1 AS NVARCHAR(500))  RETURNS TABLE

    AS RETURN

    (

    EXEC sp_executesql @sql1 OUTPUT

    );

    GO

    Mensagem 156, Nível 15, Estado 1, Procedimento fn_Consulta_LOG2, Linha 7

    Sintaxe incorreta próxima à palavra-chave 'EXEC'.

    Mensagem 102, Nível 15, Estado 1, Procedimento fn_Consulta_LOG2, Linha 8

    Sintaxe incorreta próxima a ')'.

     

    2.1) Objetivo seria

    Select * from fn_Consulta_LOG2('Select nome from tabela_cli;');

     

    3) Consigo utilizar EXEC mais não consigo colocar dentro da minha Function

    DECLARE  @SqlS AS NVARCHAR(100)

    SET @SqlS='SELECT nome FROM Tabela_Cli;'

    EXEC (@SqlS)

     

    3.1) Funciona mais não consigo colocar dentro da Function

    CREATE FUNCTION [fn_Consulta_LOG3] (@sql1 AS NVARCHAR(500))  RETURNS TABLE

    AS RETURN

    (

    DECLARE @sql2 AS NVARCHAR(100)

    SET @sql2 = @sql1

    EXEC (@sql2)

    );

    GO

    Mensagem 156, Nível 15, Estado 1, Procedimento fn_Consulta_LOG3, Linha 10

    Sintaxe incorreta próxima à palavra-chave 'DECLARE'.

    Mensagem 102, Nível 15, Estado 1, Procedimento fn_Consulta_LOG3, Linha 14

    Sintaxe incorreta próxima a ')'.

    segunda-feira, 31 de outubro de 2022 18:13

Respostas

  • Bom dia, obrigado pelo suporte. Entendi que não é possível fazer o comando Exec dento da função.

    O comando em questão não me ajuda, pois o meu objetivo seria analisar as consultas de um ERP para melhora o desempenho das consultas mais demoradas.

    Pensei em fazer uma função que receberia um consulta qualquer e grava em uma tabela auxiliar o tempo que levou para fazer cada consulta, depois pegaria as mais demoradas para otimizar o desempenho das consulta no banco de dados.

    terça-feira, 1 de novembro de 2022 12:04

Todas as Respostas

  • Caro colega,

    Dentro de uma função InLine você não pode implementar o comando Exec para realizar o processamento de uma Stored Procedure.

    Neste caso o mais indicado é fazer uso de uma Stored Procedure chamando a procedure desejada!

    Caso você queira fazer uso de uma variável, poderá declarar a mesma fora do bloco de código da sua function, e no momento da execução fazer uso da variável.

    Veja um possível exemplo:

    CREATE FUNCTION AttributesOfTable (@tableToSearch nvarchar(500))
    returns table    
    return SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
             from information_schema.columns
             where TABLE_NAME = @tableToSearch;
    go
    
    
    declare @tableToSearch table (nome_tabela varchar(50));
    INSERT into @tableToSearch values ('Customer'), ('Order'), ('Papagaio');
    
    SELECT T1.nome_tabela as [nome da tabela],
           T2.TABLE_SCHEMA as [nome do esquema],
           T2.COLUMN_NAME as [nome da coluna]
      from @tableToSearch as T1
           outer apply dbo.AttributesOfTable(T1.nome_tabela) as T2;


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

    segunda-feira, 31 de outubro de 2022 20:36
    Moderador
  • Olá pessoal,
     
    Alguma novidade sobre a consulta feita?
     
    A resposta fornecida foi útil?
     
    Obrigado por usar os fóruns do MSDN.
     
    Pablo Garcia
    ____________________________
    Por favor, lembre-se de "Marcar respostas" para respostas que resolveram seu problema, é uma maneira comum de reconhecer aqueles que ajudaram e torna mais fácil para outros visitantes encontrarem a solução mais tarde.
     
    Se você tiver algum elogio ou reclamação sobre o suporte do MSDN, sinta-se à vontade para entrar em contato com MSDNFSF@microsoft.com
    segunda-feira, 31 de outubro de 2022 20:39
  • Bom dia, obrigado pelo suporte. Entendi que não é possível fazer o comando Exec dento da função.

    O comando em questão não me ajuda, pois o meu objetivo seria analisar as consultas de um ERP para melhora o desempenho das consultas mais demoradas.

    Pensei em fazer uma função que receberia um consulta qualquer e grava em uma tabela auxiliar o tempo que levou para fazer cada consulta, depois pegaria as mais demoradas para otimizar o desempenho das consulta no banco de dados.

    terça-feira, 1 de novembro de 2022 12:04
  • Caro Colega,

    Ok, perfeito, ainda mais nesta sua necessidade a implementação de uma Stored Procedure vai justamente atender as suas necessidades, permitindo que os dados da consulta de monitoramento possam ser repassados diretamente para a Procedure.


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

    terça-feira, 1 de novembro de 2022 21:08
    Moderador