Skip to content

Instantly share code, notes, and snippets.

@pagueru
Last active June 16, 2025 00:38
Show Gist options
  • Save pagueru/c84acb4efa06bc4cb51c815c613224ea to your computer and use it in GitHub Desktop.
Save pagueru/c84acb4efa06bc4cb51c815c613224ea to your computer and use it in GitHub Desktop.
-- ====================================================================
-- CONSULTA COMPLETA PARA TESTE DE COLORAÇÃO SQL SERVER
-- Testa todos os elementos de sintaxe possíveis
-- ====================================================================
-- Script gerado com Claude Sonnet 4 usando o seguinte prompt:
-- "Gere um arquivo `.sql` no formato T-SQL para SQL Server que utilize diferentes recursos de queries,
-- com o objetivo de testar todas as variações de cores aplicadas a objetos SQL e instruções.
-- Ou seja, estou testando um tema ou formatador de código."
-- Declaração de variáveis com diferentes tipos de dados
DECLARE @id INT = 100,
@nome NVARCHAR(255) = N'João da Silva',
@data_nascimento DATETIME2 = '1990-05-15 14:30:00',
@salario DECIMAL(10,2) = 5500.75,
@ativo BIT = 1,
@xml_data XML = '<root><item>test</item></root>',
@json_data NVARCHAR(MAX) = N'{"nome": "teste", "valor": 123}',
@uuid UNIQUEIDENTIFIER = NEWID(),
@contador BIGINT = 0;
-- Criação de tabela temporária com constraints
CREATE TABLE #temp_funcionarios (
id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
nome NVARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
departamento_id INT FOREIGN KEY REFERENCES departamentos(id),
salario MONEY DEFAULT 0.00,
data_admissao DATE CHECK (data_admissao >= '2000-01-01'),
INDEX IX_temp_funcionarios_departamento NONCLUSTERED (departamento_id)
);
-- CTE (Common Table Expression) recursiva
WITH funcionarios_hierarquia AS (
-- Âncora da recursão
SELECT
id,
nome,
gerente_id,
0 AS nivel,
CAST(nome AS NVARCHAR(1000)) AS caminho
FROM funcionarios
WHERE gerente_id IS NULL
UNION ALL
-- Parte recursiva
SELECT
f.id,
f.nome,
f.gerente_id,
fh.nivel + 1,
CAST(fh.caminho + ' -> ' + f.nome AS NVARCHAR(1000))
FROM funcionarios f
INNER JOIN funcionarios_hierarquia fh ON f.gerente_id = fh.id
WHERE fh.nivel < 10 -- Limite de recursão
),
-- Segunda CTE para estatísticas
estatisticas_departamento AS (
SELECT
d.nome AS departamento,
COUNT(*) AS total_funcionarios,
AVG(CAST(f.salario AS FLOAT)) AS salario_medio,
MIN(f.data_admissao) AS primeira_admissao,
MAX(f.data_admissao) AS ultima_admissao
FROM departamentos d
LEFT JOIN funcionarios f ON d.id = f.departamento_id
GROUP BY d.id, d.nome
HAVING COUNT(*) > 0
)
-- Query principal com múltiplas operações
SELECT DISTINCT
-- Colunas com aliases e funções
ROW_NUMBER() OVER (PARTITION BY f.departamento_id ORDER BY f.salario DESC) AS ranking,
DENSE_RANK() OVER (ORDER BY f.salario DESC) AS ranking_geral,
f.id AS funcionario_id,
UPPER(f.nome) AS nome_maiusculo,
LOWER(f.email) AS email_minusculo,
CONCAT(f.nome, ' - ', d.nome) AS funcionario_departamento,
-- Funções de data
YEAR(f.data_admissao) AS ano_admissao,
MONTH(f.data_admissao) AS mes_admissao,
DATEDIFF(YEAR, f.data_admissao, GETDATE()) AS anos_empresa,
FORMAT(f.data_admissao, 'dd/MM/yyyy') AS data_formatada,
-- Funções matemáticas e de string
ROUND(f.salario * 1.15, 2) AS salario_reajustado,
ABS(f.salario - ed.salario_medio) AS diferenca_media,
SQRT(POWER(f.salario, 2)) AS salario_absoluto,
LEFT(f.nome, 10) AS nome_abreviado,
RIGHT(f.email, 10) AS final_email,
SUBSTRING(f.nome, 1, CHARINDEX(' ', f.nome + ' ') - 1) AS primeiro_nome,
LEN(TRIM(f.nome)) AS tamanho_nome,
-- Expressões condicionais
CASE
WHEN f.salario > 10000 THEN 'Alto'
WHEN f.salario BETWEEN 5000 AND 10000 THEN 'Médio'
WHEN f.salario < 5000 AND f.salario > 0 THEN 'Baixo'
ELSE 'Não informado'
END AS faixa_salarial,
IIF(f.ativo = 1, 'Ativo', 'Inativo') AS status_funcionario,
COALESCE(f.telefone, f.celular, 'Sem contato') AS contato_principal,
NULLIF(f.bonus, 0) AS bonus_valido,
ISNULL(f.comissao, 0.00) AS comissao_ou_zero,
-- Subconsultas
(SELECT COUNT(*) FROM projetos p WHERE p.responsavel_id = f.id) AS total_projetos,
(SELECT TOP 1 nome FROM projetos WHERE responsavel_id = f.id ORDER BY data_inicio DESC) AS ultimo_projeto,
-- Funções de conversão
CAST(f.salario AS VARCHAR(20)) AS salario_texto,
CONVERT(VARCHAR(10), f.data_admissao, 103) AS data_br,
TRY_CAST(f.observacoes AS INT) AS observacoes_numericas,
TRY_CONVERT(DATETIME, f.ultima_atualizacao) AS data_atualizacao,
-- Funções específicas do SQL Server
NEWID() AS guid_aleatorio,
@@SERVERNAME AS servidor,
SYSTEM_USER AS usuario_sistema,
DB_NAME() AS banco_atual,
OBJECT_NAME(f.id) AS nome_objeto
FROM funcionarios f WITH (NOLOCK)
INNER JOIN departamentos d ON f.departamento_id = d.id
LEFT OUTER JOIN enderecos e ON f.id = e.funcionario_id
RIGHT JOIN cargos c ON f.cargo_id = c.id
FULL OUTER JOIN funcionarios_hierarquia fh ON f.id = fh.id
CROSS JOIN (SELECT COUNT(*) AS total FROM funcionarios) AS totais
INNER JOIN estatisticas_departamento ed ON d.nome = ed.departamento
WHERE
-- Condições diversas
f.ativo = 1
AND f.data_admissao >= '2020-01-01'
AND f.salario BETWEEN 3000.00 AND 50000.00
AND (f.nome LIKE '%Silva%' OR f.nome LIKE '%Santos%')
AND f.email NOT LIKE '%temp%'
AND f.departamento_id IN (1, 2, 3, 5, 8)
AND f.cargo_id NOT IN (SELECT id FROM cargos WHERE ativo = 0)
AND EXISTS (SELECT 1 FROM projetos WHERE responsavel_id = f.id)
AND NOT EXISTS (SELECT 1 FROM licencas WHERE funcionario_id = f.id AND ativa = 1)
AND f.gerente_id IS NOT NULL
AND f.comissao IS NULL OR f.comissao > 0
GROUP BY
f.id, f.nome, f.email, f.salario, f.data_admissao, f.departamento_id,
d.nome, f.ativo, f.telefone, f.celular, f.bonus, f.comissao,
f.observacoes, f.ultima_atualizacao, f.cargo_id, f.gerente_id,
ed.salario_medio
HAVING
COUNT(DISTINCT e.id) >= 1
AND AVG(CAST(f.salario AS FLOAT)) > 4000
AND SUM(ISNULL(f.bonus, 0)) < 10000
ORDER BY
f.departamento_id ASC,
f.salario DESC,
f.nome ASC
OFFSET 0 ROWS
FETCH NEXT 100 ROWS ONLY;
-- Operações adicionais para testar mais elementos
-- INSERT com diferentes sintaxes
INSERT INTO #temp_funcionarios (nome, email, salario)
VALUES
('Ana Costa', '[email protected]', 4500.00),
('Carlos Lima', '[email protected]', 5200.00);
INSERT INTO #temp_funcionarios (nome, email, salario)
SELECT nome, email, salario
FROM funcionarios
WHERE departamento_id = 1;
-- UPDATE com JOIN
UPDATE f SET
salario = f.salario * 1.10,
ultima_atualizacao = GETDATE()
FROM funcionarios f
INNER JOIN departamentos d ON f.departamento_id = d.id
WHERE d.nome = 'Vendas' AND f.ativo = 1;
-- DELETE com condições complexas
DELETE FROM funcionarios
WHERE id IN (
SELECT f.id
FROM funcionarios f
LEFT JOIN projetos p ON f.id = p.responsavel_id
WHERE f.ativo = 0 AND p.id IS NULL
);
-- MERGE (UPSERT)
MERGE funcionarios AS target
USING (
SELECT nome, email, salario FROM #temp_funcionarios
) AS source (nome, email, salario)
ON target.email = source.email
WHEN MATCHED THEN
UPDATE SET salario = source.salario
WHEN NOT MATCHED THEN
INSERT (nome, email, salario)
VALUES (source.nome, source.email, source.salario);
-- Stored Procedure com parâmetros
EXEC sp_buscar_funcionarios
@departamento = 'TI',
@salario_minimo = 5000.00,
@incluir_inativos = 0;
-- Função definida pelo usuário
SELECT dbo.fn_calcular_bonus(salario, tempo_empresa) AS bonus_calculado
FROM funcionarios;
-- Transação com tratamento de erro
BEGIN TRY
BEGIN TRANSACTION;
UPDATE funcionarios SET salario = salario * 1.05;
IF @@ROWCOUNT = 0
THROW 50001, 'Nenhum funcionário foi atualizado', 1;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE();
DECLARE @ErrorSeverity INT = ERROR_SEVERITY();
DECLARE @ErrorState INT = ERROR_STATE();
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH;
-- Limpeza
DROP TABLE IF EXISTS #temp_funcionarios;
-- Comentário final para teste de coloração
/* Esta consulta testa:
- Palavras-chave (SELECT, FROM, WHERE, etc.)
- Tipos de dados (INT, VARCHAR, DATETIME, etc.)
- Funções built-in (COUNT, AVG, GETDATE, etc.)
- Operadores (+, -, *, /, =, <>, etc.)
- Literais de string ('texto', N'unicode')
- Literais numéricos (123, 45.67)
- Comentários (-- e /* */)
- Identificadores (nomes de tabelas e colunas)
- Caracteres especiais (@, #, [], etc.)
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment