Dicas sobre desenvolvimento de software, gestão e tributações

Rede Social

12 de maio de 2025

Como Executar o Mesmo SELECT em Todos os Bancos de Dados no SQL Server


🔄 Como Executar o Mesmo SELECT em Todos os Bancos de Dados no SQL Server

Imagine que você precisa rodar a mesma consulta SQL em todos os bancos de dados de um servidor SQL Server — por exemplo, buscar registros em uma tabela chamada Clientes presente em vários bancos. Fazer isso manualmente pode ser demorado e propenso a erros. Neste post, vou te mostrar como automatizar essa tarefa utilizando cursores e SQL dinâmico.


🎯 O Que Vamos Fazer?

Vamos criar um script que:

  • Lista todos os bancos de dados do servidor (exceto os bancos do sistema).
  • Percorre cada banco de dados com um cursor.
  • Executa um SELECT dinâmico no contexto de cada banco.
  • Retorna os dados incluindo o nome do banco de onde vieram.

💻 O Código

DECLARE @dbname NVARCHAR(128)
DECLARE @sql NVARCHAR(MAX)

-- Cursor para percorrer os bancos de dados
DECLARE db_cursor CURSOR FOR
SELECT name 
FROM sys.databases
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb') -- Ignora bancos do sistema

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @dbname  

WHILE @@FETCH_STATUS = 0  
BEGIN  
    SET @sql = '
    BEGIN TRY
        USE [' + @dbname + '];
        SELECT ''' + @dbname + ''' AS DatabaseName, * FROM Clientes
    END TRY
    BEGIN CATCH
        PRINT ''Erro no banco: ' + @dbname + ' - '' + ERROR_MESSAGE()
    END CATCH'
    
    EXEC sp_executesql @sql
    FETCH NEXT FROM db_cursor INTO @dbname  
END  

CLOSE db_cursor  
DEALLOCATE db_cursor

🧠 Entendendo o Script

🔹 sys.databases: Essa visão do sistema contém todos os bancos de dados do servidor. Filtramos os bancos do sistema (master, tempdb, etc.) para evitar acessos desnecessários.

🔹 Cursor: Um cursor percorre todos os bancos encontrados, armazenando o nome de cada um na variável @dbname.

🔹 SQL Dinâmico: Montamos dinamicamente uma string com o SELECT, usando USE [@dbname] para mudar o contexto do banco.

🔹 TRY...CATCH: Incluímos um bloco de tratamento de erros para evitar que um banco com problemas interrompa toda a execução.


🧪 Resultado

O script vai trazer os resultados do SELECT para cada banco, com uma coluna extra chamada DatabaseName para indicar de qual banco cada linha veio. Muito útil para consolidação de dados ou auditorias!


⚠️ Cuidados

  • Certifique-se de que a tabela (Clientes no exemplo) exista em todos os bancos.
  • Se os esquemas forem diferentes entre bancos, pode ser necessário adaptar o SELECT.
  • Evite rodar em produção sem testar antes — preferencialmente use um ambiente de homologação.

✅ Conclusão

Esse tipo de automação pode poupar horas de trabalho repetitivo e garantir mais consistência nas consultas em múltiplos bancos. Com uma abordagem simples de cursor + SQL dinâmico, conseguimos varrer o servidor inteiro de forma eficiente e controlada.

Se quiser estender essa técnica para UPDATE, INSERT ou verificações de estrutura, o princípio é o mesmo — apenas adapte o SQL gerado.

Ler

5 de maio de 2025

Como Definir Resultados-Chave (KRs) Relevantes para seus OKRs


No mundo empresarial, os OKRs (Objectives and Key Results) se tornaram uma poderosa ferramenta para definir metas e alcançar resultados com clareza e foco. Mas, enquanto o “Objetivo” é geralmente inspirador e direto, é nos “Resultados-Chave” que mora o segredo do sucesso. Afinal, como saber se estamos realmente avançando?

Neste post, você vai aprender a identificar resultados mensuráveis e eficazes para qualquer objetivo dentro da sua empresa


1. Entenda o Objetivo Primeiro


Antes de pensar em números, tenha certeza de que o seu objetivo é claro, qualitativo e indica uma direção desejada. Pergunte-se:

“O que eu quero alcançar?”

Exemplo: Aumentar a satisfação dos clientes.


2. Pergunte: “Como vou saber que alcancei isso?”


Agora pense nas métricas que indicam progresso real. Essa é a essência dos Key Results:

Quais dados me mostram sucesso?

O que posso medir para saber se melhorei?

Existe uma métrica que já usamos para isso?


3. Use Métricas Claras e Relevantes


Resultados-chave devem ser:

Quantitativos: sempre com números.

Objetivos: não dependem de opinião.

Atingíveis, porém desafiadores.


Exemplos de métricas:

Aumentar a taxa de conversão de 20% para 35%.

Reduzir o tempo de resposta do suporte de 24h para 12h.

Aumentar a nota média de avaliação do app de 3,8 para 4,5 estrelas.


4. Evite Confundir com Tarefas


Um erro comum é transformar os Key Results em atividades. Por exemplo:

Errado: Realizar pesquisa de satisfação.

Certo: Aumentar a pontuação de satisfação do cliente de 75 para 90


5. Checklist para Validar um Bom KR


Tem número?

Mede progresso?

Está ligado diretamente ao objetivo?

É possível de ser atingido no período definido?

Se a resposta for "sim" para tudo, você tem um bom Key Result.


Conclusão


Definir bons resultados-chave é o que transforma um objetivo inspirador em uma meta tangível e mensurável. É o que permite que equipes acompanhem seu progresso com clareza, tomem decisões baseadas em dados e celebrem conquistas reais.


Seus OKRs só funcionam quando os KRs são bem definidos.

Ler

14 de abril de 2025

Sql Server: Desabilitar Identity de coluna (permitir inserir)


 




No SQL Server, uma coluna com a propriedade IDENTITY é usada para gerar valores automáticos de forma incremental para registros inseridos na tabela. Isso é bastante útil quando queremos que a coluna tenha valores exclusivos e sequenciais, como um identificador (ID). No entanto, existem situações em que você pode precisar desabilitar ou essa propriedade de uma coluna já existente.

Para isso, podemos utilizar o comando SET IDENTITY_INSERT.

O que é o IDENTITY_INSERT?
O comando SET IDENTITY_INSERT permite que você insira explicitamente um valor em uma coluna que tenha a propriedade IDENTITY. Normalmente, o SQL Server gerencia automaticamente o valor dessa coluna (incrementando-o a cada inserção), mas em algumas situações, como ao importar dados ou corrigir registros, você pode precisar inserir um valor manualmente nessa coluna.

Quando o IDENTITY_INSERT está ativado para uma tabela, você pode especificar valores para a coluna IDENTITY durante a inserção, e o SQL Server vai aceitar esses valores, em vez de gerá-los automaticamente.

Sintaxe do Comando
A sintaxe básica do comando SET IDENTITY_INSERT é a seguinte:

SET IDENTITY_INSERT <nome_da_tabela> ON;

INSERT INTO <nome_da_tabela> (<coluna1>, <coluna2>, <colunaIDENTITY>, ...)
VALUES (<valor1>, <valor2>, <valorIDENTITY>, ...);

SET IDENTITY_INSERT <nome_da_tabela> OFF;

Explicação linha a linha
  1. SET IDENTITY_INSERT <nome_da_tabela> ON;: Ativa a inserção explícita na coluna IDENTITY da tabela.
  2. INSERT INTO <nome_da_tabela>: Insere os dados, incluindo valores para a coluna IDENTITY.
  3. SET IDENTITY_INSERT <nome_da_tabela> OFF;: Desativa a inserção explícita na coluna IDENTITY.

Cuidados ao Usar o IDENTITY_INSERT
Embora o comando SET IDENTITY_INSERT seja útil em várias situações, existem algumas considerações e cuidados importantes a serem observados:

Limitação por tabela: Você pode ter apenas um IDENTITY_INSERT ativo por vez. Isso significa que, se você tentar ativá-lo em várias tabelas simultaneamente, o SQL Server gerará um erro. Lembre-se de sempre desativar o IDENTITY_INSERT assim que terminar de usá-lo.

Integridade dos dados: Ao inserir manualmente um valor em uma coluna IDENTITY, o valor gerado automaticamente pode não seguir a sequência esperada. Isso pode causar problemas de integridade, como valores duplicados ou faltantes. Por exemplo, se você inserir explicitamente o valor 5, e depois tentar inserir outro valor sem especificar o ClienteID, o próximo valor será gerado automaticamente como 6. Isso pode gerar um gap na sequência de valores da coluna.

Desempenho: Embora o impacto no desempenho geralmente seja pequeno, o uso excessivo de IDENTITY_INSERT pode afetar a geração de índices e aumentar a carga de inserção na tabela. É importante utilizar o comando apenas quando necessário, como ao importar dados ou corrigir registros.

Quando Utilizar o IDENTITY_INSERT?
Aqui estão alguns cenários típicos em que você pode querer usar o comando SET IDENTITY_INSERT:

Importação de dados: Ao migrar dados de uma tabela para outra e preservar os valores existentes da coluna IDENTITY.

Restaurar dados: Durante a restauração ou recuperação de dados de backup, onde você precisa inserir valores manualmente.

Correção de valores: Quando há a necessidade de corrigir valores específicos de IDs em registros existentes, como ao tentar inserir dados com um ID específico ou corrigir falhas na sequência.

Conclusão
O comando SET IDENTITY_INSERT no SQL Server é uma ferramenta poderosa que permite inserir valores manualmente em colunas com a propriedade IDENTITY. Ele é útil em situações como importação de dados, recuperação de dados e correção de registros, mas deve ser usado com cautela para evitar problemas de integridade dos dados e desempenho. Lembre-se sempre de desativar o IDENTITY_INSERT após usá-lo e evite deixá-lo ativado por longos períodos.
Ler

7 de abril de 2025

SQL Server: Como obter linhas específicas do resultado com Row_Number


Essa função é extremamente útil quando você precisa atribuir um número sequencial a cada linha retornada pela consulta, como quando deseja limitar a quantidade de registros retornados ou criar uma ordenação personalizada.

Neste post, vamos explicar como utilizar a função ROW_NUMBER() no SQL Server e dar exemplos práticos de como ela funciona.


O que é o ROW_NUMBER() no SQL Server?

A função ROW_NUMBER() é usada para atribuir um número único e sequencial a cada linha de um conjunto de resultados. A numeração começa em 1 e é incrementada conforme as linhas são retornadas. Ela pode ser particularmente útil para criar relatórios, paginar resultados ou aplicar filtros de forma mais flexível.

O ROW_NUMBER() exige que você forneça uma cláusula ORDER BY, pois a numeração depende da ordem dos dados. Caso contrário, o SQL Server pode gerar a numeração de forma arbitrária.

A sintaxe básica do ROW_NUMBER() é:

SELECT ROW_NUMBER() OVER (ORDER BY [coluna]) AS RowNum, [outras_colunas] FROM [tabela];

ROW_NUMBER(): Função que gera o número sequencial.

OVER (ORDER BY [coluna]): Define a ordem das linhas. O número será atribuído com base nessa ordem.

RowNum: O alias (nome) dado à coluna que contém os números sequenciais.

Exemplo Prático

Vamos imaginar uma tabela chamada Funcionarios com as colunas ID, Nome e Salario. Suponha que você queira listar todos os funcionários e atribuir um número de linha a cada um deles, baseado no valor do salário (do maior para o menor).

Consulta:

SELECT ROW_NUMBER() OVER (ORDER BY Salario DESC) AS RowNum, ID, Nome, Salario FROM Funcionarios;

A função ROW_NUMBER() é utilizada para gerar um número sequencial, com base na ordenação dos salários em ordem decrescente (ORDER BY Salario DESC).

A consulta retornará uma lista de funcionários, com um número (RowNum) atribuído a cada linha, começando de 1 para o maior salário.


Limitando os Resultados com ROW_NUMBER()

Se você quiser apenas os 5 primeiros funcionários com os maiores salários, pode usar o ROW_NUMBER() em conjunto com uma subconsulta ou CTE (Common Table Expression) para filtrar os resultados. Por exemplo:

Consulta para obter os 5 funcionários com os maiores salários:

WITH FuncComRowNum AS ( SELECT ROW_NUMBER() OVER (ORDER BY Salario DESC) AS RowNum, ID, Nome, Salario FROM Funcionarios ) SELECT ID, Nome, Salario FROM FuncComRowNum WHERE RowNum <= 5;

Explicação:

Usamos uma CTE (WITH FuncComRowNum AS (...)) para gerar a coluna RowNum para cada funcionário com base no salário.

Em seguida, filtramos os resultados na consulta principal, utilizando WHERE RowNum <= 5 para retornar apenas os 5 primeiros funcionários.


Usando ROW_NUMBER() para Paginação

Um dos usos mais comuns de ROW_NUMBER() é na paginação de resultados. Suponha que você tenha uma grande quantidade de dados e queira dividir os resultados em páginas de 10 itens. Você pode fazer isso utilizando a função ROW_NUMBER().

Exemplo para paginação de 10 itens por página:

WITH Pagina AS ( SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNum, ID, Nome, Salario FROM Funcionarios ) SELECT ID, Nome, Salario FROM Pagina WHERE RowNum BETWEEN 11 AND 20; -- Página 2 (itens 11 a 20)

Explicação:

A CTE Pagina atribui um número de linha a cada funcionário, baseado no ID.

A consulta externa usa WHERE RowNum BETWEEN 11 AND 20 para pegar os registros da 11ª à 20ª linha, representando a segunda página de resultados.


Considerações Finais

A função ROW_NUMBER() oferece uma alternativa poderosa e flexível para atribuir números sequenciais às linhas de uma consulta. Com ela, você pode ordenar dados, implementar paginação e aplicar filtros complexos de maneira eficiente.

A função ROW_NUMBER() é muito útil em diversos cenários, como quando você precisa:

  • Ordenar resultados de maneira específica e numerada.
  • Realizar paginação de resultados em consultas grandes.
  • Trabalhar com filtros baseados em posição de linha.

Ler

31 de março de 2025

Sql Server: Listando todas as triggers com status e tipo


No SQL Server, triggers (ou gatilhos) são objetos que permitem que você defina ações automáticas a serem executadas quando certos eventos ocorrem em uma tabela ou vista. Por exemplo, você pode ter triggers que são acionadas quando dados são inseridos, atualizados ou excluídos em uma tabela. Elas são úteis para auditoria de dados, validações e outras ações automáticas.

Para listar todas as triggers de um banco de dados no SQL Server, podemos consultar as tabelas do sistema que armazenam informações sobre os objetos do banco de dados. Uma das principais views do sistema para isso é a sys.triggers, que contém informações sobre todas as triggers do banco de dados.

A consulta SQL básica para listar todas as triggers de um banco de dados é:

SELECT
t.name AS Nome_da_Trigger,
t.is_disabled AS Está_Desabilitada,
o.name AS Nome_da_Tabela,
t.type_desc AS Tipo_de_Trigger
FROM
sys.triggers t
INNER JOIN
sys.objects o ON t.parent_id = o.object_id
WHERE
o.type = 'U' -- 'U' representa tabelas de usuário
ORDER BY
t.name;


Explicação do Comando:

sys.triggers: Esta view contém informações sobre todas as triggers no banco de dados.

sys.objects: Esta view contém informações sobre os objetos no banco de dados (como tabelas, views, procedures etc.).

t.name: Nome da trigger.

t.is_disabled: Indica se a trigger está desabilitada (1 para desabilitada, 0 para habilitada).

o.name: Nome da tabela (ou view) associada à trigger.

t.type_desc: Descrição do tipo de trigger, como AFTER INSERT, INSTEAD OF DELETE, etc.

o.type = 'U': Filtra para retornar apenas triggers associadas a tabelas de usuário ('U' significa tabela de usuário).


Considerações sobre os tipos de triggers:

As triggers podem ser classificadas de acordo com os eventos que as acionam. Alguns exemplos incluem:

AFTER INSERT: A trigger é executada após a inserção de dados na tabela.

AFTER UPDATE: A trigger é executada após uma atualização na tabela.

AFTER DELETE: A trigger é executada após a exclusão de dados na tabela.

INSTEAD OF INSERT: A trigger substitui a ação de inserção.

INSTEAD OF UPDATE: A trigger substitui a ação de atualização.

INSTEAD OF DELETE: A trigger substitui a ação de exclusão.


Como identificar triggers associadas a uma tabela específica?

Se você deseja listar apenas as triggers de uma tabela específica, você pode adicionar um filtro no nome da tabela. Por exemplo, para listar as triggers associadas à tabela Produtos:

USE LojaDB;
GO

SELECT
t.name AS Nome_da_Trigger,
t.is_disabled AS Está_Desabilitada,
o.name AS Nome_da_Tabela,
t.type_desc AS Tipo_de_Trigger
FROM
sys.triggers t
INNER JOIN
sys.objects o ON t.parent_id = o.object_id
WHERE
o.type = 'U'
AND o.name = 'Produtos' -- Filtro para a tabela 'Produtos'
ORDER BY
t.name;


Considerações Finais

Listar e gerenciar triggers é uma tarefa fundamental para manter a integridade e a consistência dos dados em um banco de dados SQL Server. Triggers podem ser úteis em diversas situações, como garantir que certas condições sejam atendidas automaticamente após a inserção ou atualização de dados, ou até mesmo realizar auditoria de dados de forma automática.

Além disso, sempre é importante verificar se as triggers estão habilitadas ou desabilitadas, pois elas podem afetar o desempenho das consultas e a lógica de negócio. 

Ler

24 de março de 2025

Sql Server: verificar varchar nulo ou vazio


Como verificar se o texto de uma coluna do tipo VARCHAR está vazio ou se o campo está com conteúdo nulo no SQL Server

No SQL Server, é comum lidarmos com colunas do tipo VARCHAR para armazenar dados textuais. No entanto, ao realizar consultas ou manipulações de dados, podemos nos deparar com situações onde a coluna contém valores nulos (NULL) ou vazios (uma string com zero caracteres). Saber como tratar essas condições é essencial para garantir a integridade dos dados e otimizar as consultas.

No SQL Server, você pode usar as funções IS NULL e LEN() para realizar essas verificações.


Verificando se o valor é nulo:

O valor NULL é utilizado para representar dados ausentes ou desconhecidos. Para verificar se uma coluna contém um valor NULL, utilizamos a cláusula IS NULL.

SELECT *
FROM sua_tabela
WHERE sua_coluna IS NULL;

Esse comando retorna todas as linhas onde a coluna sua_coluna contém um valor nulo.


Verificando se o valor está vazio:

Para verificar se o valor de uma coluna VARCHAR está vazio, podemos usar a função LEN(). A função LEN() retorna o comprimento de uma string. Se o comprimento for 0, significa que a string está vazia.

SELECT *
FROM sua_tabela
WHERE LEN(sua_coluna) = 0;

Esse comando retorna todas as linhas onde a coluna sua_coluna contém uma string vazia.


Verificando se o valor é nulo ou vazio:

Para facilitar a verificação de ambas as condições — ou seja, se o valor é nulo ou vazio — podemos combinar as verificações usando a cláusula OR.

SELECT *
FROM sua_tabela
WHERE sua_coluna IS NULL OR LEN(sua_coluna) = 0;

Esse comando retorna todas as linhas onde a coluna sua_coluna é nula ou contém uma string vazia.


Como tratar os valores nulos e vazios?

Em alguns casos, você pode querer substituir valores nulos ou vazios por um valor padrão, como "Desconhecido". Para isso, você pode usar a função COALESCE ou ISNULL para substituir valores nulos. Se a coluna contiver uma string vazia, você pode usar a função NULLIF para tratá-la.


Usando COALESCE para substituir NULL por "Desconhecido":

SELECT COALESCE(Endereço, 'Desconhecido') AS Endereço
FROM Clientes;

Esse comando substitui qualquer valor NULL na coluna Endereço por "Desconhecido".


Usando NULLIF para tratar valores vazios:

Se você também quiser tratar valores vazios, pode combinar NULLIF e COALESCE:

SELECT COALESCE(NULLIF(LEN(Endereço), 0), 'Desconhecido') AS Endereço
FROM Clientes;

Nesse caso, a função NULLIF(LEN(Endereço), 0) vai retornar NULL para as linhas onde a coluna Endereço estiver vazia (comprimento igual a 0). Em seguida, a função COALESCE substitui esses valores por "Desconhecido".


Considerações Finais

É muito comum encontrar dados nulos ou vazios em bancos de dados. Saber como tratá-los corretamente ajuda a garantir que suas consultas e operações de dados sejam feitas de forma eficiente e sem erros inesperados.

Se você tiver dúvidas ou sugestões, deixe um comentário abaixo!

Ler