Usuário com melhor resposta
Function receber um SQL e retornar um Table

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.
- Marcado como Resposta Function receber um SQL e retornar um Table terça-feira, 1 de novembro de 2022 15:34
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:36Moderador -
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.comsegunda-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.
- Marcado como Resposta Function receber um SQL e retornar um Table terça-feira, 1 de novembro de 2022 15:34
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:08Moderador