Ir para o conteúdo principal

Apresentando Script SQL em Databricks, Parte 2

Um mergulho profundo nas construções de script SQL e como usá-las

SQL Scripting Deep Dive OG

Published: May 19, 2025

Produto11 min de leitura

Summary

  • Introduzir e explicar recursos de criação de scripts SQL
  • Executar condicionalmente e controlar o fluxo dentro dos scripts SQL
  • Interceptar e lidar com condições de erro específicas

Na segunda parte da série de blogs sobre o anúncio de Scripting SQL, examinaremos a tarefa administrativa que discutimos em a primeira parte - como aplicar uma regra insensível a maiúsculas e minúsculas em todas as colunas STRING de uma tabela. Vamos percorrer esse exemplo passo a passo, explicar os recursos usados e expandi-lo além de uma única tabela para cobrir todo um esquema.

Você também pode acompanhar neste notebook

Alterando a ordenação de todos os campos de texto em todas as tabelas em um esquema

O Databricks suporta uma ampla gama de colações sensíveis ao idioma, insensíveis a maiúsculas e minúsculas, e insensíveis a acentos. É fácil usar esse recurso para novas tabelas e colunas. Mas e se você tem um sistema existente que usa upper() ou lower() em predicados em todos os lugares e quer aproveitar as melhorias de desempenho associadas a uma colação nativa insensível a maiúsculas e minúsculas, ao mesmo tempo que simplifica suas consultas? Isso exigirá alguma programação; agora você pode fazer tudo em SQL. 

Vamos usar o seguinte esquema de teste: 

A ordem é baseada nos pontos de código ASCII, onde todas as letras maiúsculas precedem todas as letras minúsculas. Você pode corrigir isso sem adicionar upper() ou lower()?

Declarações SQL dinâmicas e definição de variáveis

Nosso primeiro passo é dizer à tabela para alterar sua ordenação padrão para colunas recém-adicionadas. Você pode alimentar suas variáveis locais com marcadores de parâmetro, que o notebook detectará automaticamente e adicionará widgets. Você também pode usar EXECUTE IMEDIATO para executar um composto dinamicamente ALTERAR TABELA declaração.

Todo script SQL consiste em uma declaração BEGIN .. END (composta). Variáveis locais são definidas primeiro dentro de uma declaração composta, seguida pela lógica.

Isso é tudo apenas um conjunto de declarações lineares. Até agora, você poderia escrever tudo isso com variáveis de sessão SQL sem a declaração composta. Você também não conseguiu muito. Afinal, você queria alterar a ordenação para colunas existentes. Para fazer isso, você precisa:

  • Descubra todas as colunas de string existentes na tabela
  • Altere a ordenação para cada coluna

Em resumo, você precisa fazer um loop na INFORMATION_SCHEMA.COLUMNS tabela.

Loops

O SQL Scripting oferece quatro maneiras de fazer loops e maneiras de controlar as iterações do loop.

  1. LOOP … END LOOP;
    Este é um loop "infinito".
    Este loop continuará até que uma exceção ou um comando explícito ITERATE ou LEAVE interrompa o loop.
    Vamos discutir o tratamento de exceções mais tarde e apontar para a documentação ITERATE e LEAVE explicando como controlar loops.
  2. WHILE predicado DO … END WHILE;
    O loop será iniciado e reiniciado enquanto a expressão do predicado for verdadeira ou o loop for interrompido por uma exceção, ITERATE ou LEAVE.
  3. REPEAT … UNTIL predicate END REPEAT;
    Diferente do WHILE, este loop é executado pelo menos uma vez e é reexecutado até que a expressão do predicado seja avaliada como falsa ou o loop seja interrompido por uma exceção, comando LEAVE ou ITERATE.
  4. PARA consulta FAÇA …. FIM PARA;
    Este loop executa uma vez por linha que a consulta retorna, a menos que seja interrompido antecipadamente com uma exceção, SAIR, ou declaração ITERATE.

Agora, aplique o loop FOR ao nosso script de collation. A consulta obtém os nomes das colunas de todas as colunas de string da tabela. O corpo do loop altera a collation de cada coluna por vez:


Vamos verificar se a tabela foi atualizada corretamente:

Até agora, tudo bem. Nosso código está funcionalmente completo, mas você deve informar ao Delta para analisar as colunas que você modificou para se beneficiar da omissão de arquivos. Você não quer fazer isso por coluna. Mas reúna todas elas e faça o trabalho apenas se houve, de fato, uma coluna de string para a qual a colação foi alterada. Decisões, decisões... 

Lógica condicional

O SQL Scripting oferece três maneiras de executar condicionalmente instruções SQL.

  1. Se-então-senão lógica. A sintaxe para isso é simples:
    SE predicado ENTÃO … SENÃO SE predicado ENTÃO … SENÃO …. FIM SE;
    Naturalmente, você pode ter qualquer número de blocos SENÃO SE opcionais, e o final SENÃO também é opcional.
  2. Uma simples declaração CASE
    Esta declaração é a versão de script SQL da expressão case simples.
    Expressão CASE QUANDO opção ENTÃO … SENÃO … FIM CASO;
    Uma única execução de uma expressão é comparada a várias opções, e a primeira correspondência decide qual conjunto de instruções SQL deve ser executado. Se nenhuma corresponder, o bloco ELSE opcional será executado.
  3. Uma instrução CASE pesquisada
    Esta instrução é a versão SQL Scripting da expressão case pesquisada.
    CASE WHEN predicado THEN …. ELSE … END CASE;
    O bloco THEN é executado para o primeiro de qualquer predicado que avalie como verdadeiro. Se nenhum corresponder, o bloco ELSE opcional é executado.

Para nosso script de ordenação, um simples SE ENTÃO FIM SE será suficiente. Você também precisa coletar o conjunto de colunas para aplicar ANALYZE e alguma mágica de função de ordem superior para produzir a lista de colunas:

Aninhamento

O que você escreveu até agora funciona para tabelas individuais. E se você quiser operar em todas as tabelas em um esquema? O Scripting SQL é totalmente componível. Você pode aninhar declarações compostas, declarações condicionais e loops dentro de outras declarações de script SQL.

Então, o que você fará aqui é duplo:

  1. Adicione um loop externo FOR para encontrar todas as tabelas dentro de um esquema usando INFORMATION_SCHEMA.TABLES. Como parte disso, você precisa substituir as referências à variável de nome da tabela pelas referências aos resultados da consulta do loop FOR
  2. Adicione um composto aninhado para mover a variável da lista de colunas para o loop FOR externo. Você não pode declarar uma variável diretamente no corpo do loop FOR; isso não adiciona um novo escopo. Esta é principalmente uma decisão relacionada ao estilo de codificação, mas você terá um motivo mais sério para um novo escopo..

Esse erro faz sentido. Você tem várias maneiras de proceder:

  1. Filtrar tipos de tabela não suportados, como visualizações, na consulta do esquema de informações. O problema é que existem vários tipos de tabelas, e novos são adicionados ocasionalmente.
  2. Lidar com visualizações. Isso é uma ótima ideia. Vamos chamar isso de sua tarefa de casa.
  3. Tolerando a condição de erro

Tratamento de exceções

Uma capacidade chave da programação SQL é a habilidade de interceptar e lidar com exceções. Os manipuladores de condição são definidos na seção de declaração de uma instrução composta, e eles se aplicam a qualquer instrução dentro dessa composição, incluindo instruções aninhadas. Você pode lidar com condições de erro específicas por nome, SQLSTATEs específicos que lidam com várias condições de erro, ou todas as condições de erro. Dentro do corpo do manipulador de condição, você pode usar a instrução GET DIAGNOSTICS para recuperar informações sobre a exceção sendo tratada e executar qualquer script SQL que você considere apropriado, como registrar o erro em um log ou executar uma lógica alternativa à que falhou. Você pode então SINALIZAR uma nova condição de erro, RESINALIZAR a condição original, ou simplesmente sair da instrução composta onde o manipulador está definido e continuar com a instrução seguinte.

No nosso script, você quer pular qualquer instrução para a qual a instrução ALTER TABLE DEFAULT COLLATION não se aplicou e registre o nome do objeto.

Acima, você desenvolveu um script administrativo puramente em SQL. Você também pode escrever scripts ELT e transformá-los em Jobs. A criação de scripts SQL é uma ferramenta verdadeiramente poderosa que você deve explorar.  

O que fazer a seguir

Se você já é um usuário do Databricks ou está migrando de outro produto, o script SQL é uma capacidade que você deve usar. O script SQL segue o padrão ANSI e é totalmente compatível com OSS Apache Spark™. O script SQL é descrito em detalhes em Script SQL | Documentação do Databricks

Você também pode usar este notebook para ver por si mesmo. 

 

(This blog post has been translated using AI-powered tools) Original Post

Nunca perca uma postagem da Databricks

Inscreva-se nas categorias de seu interesse e receba as últimas postagens na sua caixa de entrada