Fala pessoal! Tudo bem com vocês?

Recentemente, tive o prazer de participar de uma live sensacional no canal .NET com o mestre Renato Groff, onde mergulhamos de cabeça no que há de mais moderno em Inteligência Artificial aplicada a Bancos de Dados.

Se você achava que IA era coisa apenas de desenvolvedor front-end ou cientista de dados, prepare-se: o jogo mudou e o SQL Server 2025 está aqui para provar isso.

Neste post, vou resumir os pontos principais que construímos na live, focando na integração nativa do SQL Server com o Azure Open AI e como monitorar tudo isso com OpenTelemetry e Grafana.

 

O Salto para o SQL Server 2025

A grande estrela da noite foi o anúncio das capacidades do SQL Server 2025 (Public Preview). A Microsoft finalmente trouxe para o “on-premises” (e para o SQL Database) um recurso que antes dependia de gambiarras ou CLR complexos: a execução nativa de chamadas REST.

Através da procedure de sistema sp_invoke_external_rest_endpoint, agora conseguimos nos comunicar com qualquer API, inclusive a do Azure Open AI, sem sair da nossa query.

O uso de CLR (Common Language Runtime) ainda é uma alternativa para versões anteriores (como 2017 ou 2019), mas a performance e a segurança do suporte nativo no SQL 2025 são incomparáveis.

Arquitetura de Integração: Azure Open AI

Para que essa mágica aconteça, utilizamos o modelo GPT-4o mini. Por que o “mini”? Simples: Custo-Benefício. Ele é absurdamente mais barato que o GPT-4o completo (cerca de 20 a 30 vezes menos) e entrega uma precisão excelente para tarefas de banco de dados, como gerar comandos T-SQL ou resumir logs.

Segurança: Utilizando Database Scoped Credentials para evitar vazamentos de credenciais

Como um profissional Senior, a primeira coisa que penso é: “Vou expor minha API Key em texto limpo?”. Jamais.

A boa prática aqui é utilizar as Database Scoped Credentials: Criamos uma credencial que armazena o token de autorização, assim, o desenvolvedor que chama a procedure não tem acesso à chave da API, apenas ao nome da credencial.

Importante: Antes de criar as credenciais, você precisa habilitar a Master Key no banco de dados para garantir a criptografia dos segredos.

O Script: Transformando o SQL Server em um DBA Virtual

Abaixo, apresento o script completo para configurar essa integração e criar uma procedure que interpreta linguagem natural e executa comandos no seu banco.

-- Cria a masterkey do banco
IF NOT EXISTS(SELECT * FROM sys.symmetric_keys WHERE [name] = '##MS_DatabaseMasterKey##') 
BEGIN
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'LONg_Pa$$_w0rd!'
END
GO


-- Cria as credenciais
IF EXISTS(SELECT * FROM sys.database_scoped_credentials WHERE [name] = 'https://dirceu-openai.openai.azure.com')
BEGIN
    DROP DATABASE SCOPED CREDENTIAL [https://dirceu-openai.openai.azure.com]
END;


DECLARE 
    @Query VARCHAR(MAX)


SET @Query = 'CREATE DATABASE SCOPED CREDENTIAL [https://dirceu-openai.openai.azure.com] WITH IDENTITY = ''HTTPEndpointHeaders'', SECRET = ''{"Authorization": "Bearer ' + CONVERT(VARCHAR(MAX), 'Chave_API_AQUI')  + '"}'''
EXEC(@Query)


CREATE OR ALTER PROCEDURE dbo.stpExecuta_SQL_IA (
    @Prompt VARCHAR(MAX),
    @Fl_Debug BIT = 0
)
AS 
BEGIN

    -- Executa a API
    DECLARE
        @ret INT,
        @response NVARCHAR(MAX),
        @payload VARCHAR(MAX) = '{
      "messages": [
        {
          "role": "system",
          "content": [
            {
              "type": "text",
              "text": "Essas são as instruções básicas para você: Você é um DBA SQL Server. Tudo que eu te perguntar, você deve responder apenas com comandos T-SQL. NUNCA, JAMAIS, EM NENHUMA HIPÓTESE, VOCÊ DEVERÁ ME RESPONDER COM QUALQUER MENSAGEM OU NENHUM CARACTERE QUE NÃO SEJA PARTE DE UM CÓDIGO T-SQL. Se limite a responder apenas o que eu perguntar, com comandos T-SQL. Se não for possível responder ou for uma pergunta que não faça sentido do ponto de vista de um banco SQL Server, não responda nada, retorne vazio. O que eu quero saber é: ' + @Prompt + '"
            }
          ]
        }
      ],
      "temperature": 0.7,
      "top_p": 0.95,
      "max_tokens": 8000
    }'

    EXEC @ret = sys.sp_invoke_external_rest_endpoint 
	    @method = 'POST',
	    @url = N'https://dirceu-openai.openai.azure.com/openai/deployments/gpt-4o-mini/chat/completions?api-version=2025-01-01-preview',
	    @payload = @payload,
            @credential = [https://dirceu-openai.openai.azure.com],
	    @response = @response OUTPUT

    -- PRINT @response


    DECLARE @retorno VARCHAR(MAX)
    
    SET @retorno = JSON_VALUE(@response, '$.result.choices[0].message.content')


    SET @retorno = REPLACE(REPLACE(@retorno, '```sql', ''), '```', '')

    PRINT @retorno

    IF (LEN(TRIM(@retorno)) > 0 AND @Fl_Debug = 0)
        EXEC(@retorno)

END


-- EXEC dbo.stpExecuta_SQL_IA 'Quero criar uma tabela chamada Clientes com os campos nome, cpf e idade. Se a tabela já existir, pode excluir.'


-- EXEC dbo.stpExecuta_SQL_IA 'Quero criar uma tabela chamada Clientes com os campos nome, cpf e idade. Se a tabela já existir, pode excluir.'
-- EXEC dbo.stpExecuta_SQL_IA 'Na minha tabela de Clientes, que tem os campos nome, cpf (char(11)) e idade, insere 50 registros.'
-- EXEC dbo.stpExecuta_SQL_IA 'Retorne as colunas nome e idade da minha tabela de clientes'
-- EXEC dbo.stpExecuta_SQL_IA 'Retorne os dados da minha tabela de clientes onde a idade seja igual a 36'
-- EXEC dbo.stpExecuta_SQL_IA 'Retorne os dados da minha tabela de clientes onde a idade seja igual a 36 ou 38 ou 40'
-- EXEC dbo.stpExecuta_SQL_IA 'Retorne os dados da minha tabela de clientes onde a idade seja igual a 36 ou 38 ou 40 e o final do cpf termine com um número par'

-- EXEC dbo.stpExecuta_SQL_IA 'Quero criar uma tabela com de clientes com os campos nome, cpf e idade. Se a tabela já existir, pode excluir. Insere 50 registros nessa tabela e retorna os dados', @Fl_Debug = 0

Observabilidade e Monitoramento

Não basta integrar, tem que monitorar. Durante a demo, o Renato Groff mostrou como o Semantic Kernel e o OpenTelemetry são vitais.

Quando o SQL Server faz uma chamada para a IA, geramos tokens. Esses tokens custam dinheiro. Ao instrumentar a aplicação com Grafana e Aloy, conseguimos capturar:

  • Input Tokens vs. Output Tokens: Quanto estamos gastando por pergunta.
  • Wait Types: Monitorar latência de rede na chamada da API (atenção para esperas de rede que podem travar workers do SQL).
  • Trace ID: Amarrar a pergunta do usuário no front-end até a query gerada pela IA no banco de dados.
ALERTA CRÍTICO: Dar permissão para uma IA executar comandos SQL dinâmicos (EXEC sp_executesql) abre brechas para Prompt Injection. Sempre utilize usuários com o princípio do menor privilégio (apenas SELECT em tabelas específicas) e nunca rode isso em produção sem um Resource Governor configurado para limitar CPU/Memória dessas consultas.

Tabela de Referência: Limites e Tokens

Para ajudar no planejamento de custos, aqui está uma estimativa simplificada do modelo GPT-4o mini:

Modelo Custo Entrada (1M tokens) Custo Saída (1M tokens) Uso Recomendado
GPT-4o $5.00 $15.00 Lógicas complexas e análise de erros.
GPT-4o mini $0.15 $0.60 Consultas SQL simples e resumos.

Performance e Impacto

Ao utilizar o sp_invoke_external_rest_endpoint, o SQL Server gerencia a conexão HTTP de forma assíncrona internamente, mas a sessão do usuário fica em modo de espera até o retorno da API. Em ambientes de altíssima concorrência, isso pode elevar os contadores de External Wait.

A dica é usar essa funcionalidade para tarefas de Background, BI ou ferramentas administrativas, evitando o fluxo principal de gravação de transações (OLTP).

 

Espero que tenham gostado dessa dica, um grande abraço e até a próxima!