> For the complete documentation index, see [llms.txt](https://wedocs.gitbook.io/wedocs-5.2/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wedocs.gitbook.io/wedocs-5.2/weknow-client/cadastros-gerais/metadados/linguagem-de-modelo-dinamica-no-editor-de-metadados-sql.md).

# Linguagem de Modelo Dinâmica no Editor de Metadados (SQL)

A **Linguagem de Modelo Dinâmica** foi implementada no **Editor de Metadados SQL** para permitir a criação de consultas dinâmicas, reutilizáveis e adaptáveis conforme o contexto da execução.

Com essa funcionalidade, o SQL pode utilizar estruturas como **condicionais, repetições, variáveis, expressões e comentários**, permitindo adaptar a consulta de acordo com parâmetros e regras definidas no metadado.

A funcionalidade está disponível para metadados SQL e pode ser habilitada no Editor de Metadados, na seção **Avançado**, ativando a opção "**Utilizar linguagem de modelo dinâmica (apenas SQL)"**

<div align="center"><figure><img src="https://2272670858-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fe85p03cLIYvL7gAVHE90%2Fuploads%2FkPQ2MFhtrjMqFXDrw79c%2Fimage.png?alt=media&amp;token=be53f89a-b0b0-4c11-bea3-04df00f0b8a3" alt="" width="563"><figcaption><p>Opção para habilitar a Linguagem de Modelo Dinâmica no Editor de Metadados</p></figcaption></figure></div>

Após habilitar a funcionalidade, o editor disponibiliza recursos para facilitar a criação e validação dos modelos, como renderização dinâmica do SQL, sugestões, autocomplete, snippets, validação e pré-visualização do SQL gerado.

### Como funciona

A Linguagem de Modelo Dinâmica combina o SQL com blocos de comandos que são processados durante a geração da consulta.

As **expressões** utilizam a sintaxe:

```
{{ EXPRESSAO }}
```

Elas permitem inserir valores calculados ou obtidos dinamicamente na consulta.

Por exemplo:

```
{{ @currDT }}
```

Os **comandos** utilizam a sintaxe:

```
{% COMANDO %}
```

Eles permitem adicionar lógica à consulta, como condições e repetições.

Por exemplo:

```
{% if :customer_id <> @null %}
```

Também é possível utilizar **comentários internos**, que não são considerados na consulta final:

```
{# comentário interno #}
```

### Sintaxe utilizada

A Linguagem de Modelo Dinâmica utiliza a sintaxe das **fórmulas do Weknow** para definir expressões e condições.

Isso significa que os trechos dinâmicos não utilizam uma nova linguagem SQL. Os recursos disponibilizados pela Linguagem de Modelo Dinâmica utilizam a sintaxe de fórmulas já utilizada pelo Weknow.

Por exemplo, para verificar se um parâmetro possui valor, pode ser utilizada a função `getVar()` em conjunto com `@null`:

```
{% if getVar('p_ds_unidade_hosp') <> @null %}
where
    :p_ds_unidade_hosp = ds_unidade_hosp
{% endif %}
```

Nesse exemplo, o trecho `WHERE` somente será incluído na consulta quando o parâmetro `p_ds_unidade_hosp` possuir um valor.

{% hint style="warning" %}
**Importante:** os trechos de lógica utilizados na Linguagem de Modelo Dinâmica devem seguir a sintaxe das **fórmulas do Weknow**.
{% endhint %}

### Variáveis utilizadas na Linguagem de Modelo Dinâmica

A função `getVar()` permite acessar valores disponíveis durante a geração da consulta.

Entre os exemplos de utilização estão:

* `getVar('virtualTableNames')`: utilizada para obter os nomes das tabelas virtuais disponíveis.
* `getVar('p_ds_unidade_hosp')`: utilizada para acessar o valor do parâmetro `p_ds_unidade_hosp`.

A disponibilidade e o conteúdo das variáveis dependem do contexto em que a consulta está sendo executada.

No exemplo de união de tabelas virtuais apresentado a seguir, `virtualTableName` é utilizado no comando `for` para referenciar a tabela de cada iteração.

### Exemplos de utilização

#### Unir tabelas virtuais dinamicamente

A Linguagem de Modelo Dinâmica pode ser utilizada para gerar uma consulta que percorre diferentes tabelas virtuais e combina os resultados utilizando `UNION ALL`.

Por exemplo:

```
{% for virtualTableName in getVar('virtualTableNames'), sep = 'union all' %}
select
    ds_unidade_hosp,
    qt_internacoes,
    qt_cirurgias,
    tx_ocupacao
from
    {{ getVar('virtualTableName') }}
{% endfor %}
```

Nesse exemplo:

1. `getVar('virtualTableNames')` fornece os nomes das tabelas virtuais.
2. O comando `for` percorre as tabelas disponíveis.
3. `getVar('virtualTableName')` identifica a tabela utilizada em cada iteração.
4. `UNION ALL` é utilizado para combinar os resultados das consultas.

O resultado é uma consulta SQL formada dinamicamente a partir das tabelas virtuais disponíveis.

<figure><img src="https://2272670858-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fe85p03cLIYvL7gAVHE90%2Fuploads%2FhFxtnqipxUhrzcomTDRE%2Fimage.png?alt=media&amp;token=c5e4fb20-3f9d-430a-a1f3-afac49438bc0" alt=""><figcaption><p>Consulta utlizando a Linguagem de Modelo Dinâmica para unir tabelas virtuais.</p></figcaption></figure>

#### Criar uma cláusula WHERE condicional

Também é possível utilizar condições para incluir determinados trechos do SQL somente quando uma informação estiver disponível.

Por exemplo:

```
with temp as (
    select
        'HES' ds_unidade_hosp,
        8065 qt_internacoes,
        965 qt_cirurgias,
        98 tx_ocupacao

    union all

    select
        'HVC' ds_unidade_hosp,
        10165 qt_internacoes,
        1565 qt_cirurgias,
        85 tx_ocupacao
)

select
    *
from
    temp
{% if getVar('p_ds_unidade_hosp') <> @null %}
where
    :p_ds_unidade_hosp = ds_unidade_hosp
{% endif %}
```

Nesse exemplo, a cláusula `WHERE` somente será adicionada à consulta quando o parâmetro `p_ds_unidade_hosp` estiver preenchido.

Dessa forma, a mesma consulta pode ser utilizada com ou sem o filtro, de acordo com o valor informado pelo usuário.

<figure><img src="https://2272670858-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fe85p03cLIYvL7gAVHE90%2Fuploads%2F2VN3ly1UB43TW8OySobd%2Fimage.png?alt=media&amp;token=a6800694-8f9d-40d0-b35b-ddb6502a2df2" alt=""><figcaption><p><strong>Consulta no Editor de Metadados com a condição baseada em <code>getVar('p_ds_unidade_hosp')</code> e <code>@null</code>, mostrando a cláusula <code>WHERE</code> condicional</strong></p></figcaption></figure>

### Recursos do editor

Ao utilizar a Linguagem de Modelo Dinâmica, o Editor de Metadados disponibiliza recursos que auxiliam na criação e manutenção das consultas, incluindo:

* renderização dinâmica do SQL;
* autocomplete contextual;
* snippets automáticos;
* validação;
* pré-visualização do SQL renderizado;
* fechamento automático de delimitadores;
* destaque de pares de delimitadores;
* sugestões automáticas;
* recursos de navegação e produtividade.

Esses recursos facilitam a criação, validação e manutenção dos modelos utilizados nas consultas.

### Quando utilizar

A Linguagem de Modelo Dinâmica pode ser utilizada em cenários que exigem que a consulta seja adaptada durante sua execução, como:

* filtros opcionais;
* cláusulas condicionais;
* união dinâmica de tabelas;
* reaproveitamento de estruturas SQL;
* aplicação de regras de negócio variáveis;
* utilização de parâmetros para modificar a consulta.

A utilização de modelos dinâmicos pode reduzir a necessidade de manter diferentes versões de uma mesma consulta e facilitar sua manutenção.

### Documentação complementar

Os recursos adicionados ao Editor de Metadados pela Linguagem de Modelo Dinâmica possuem funcionalidades específicas para edição, validação e navegação.

Para conhecer os demais recursos disponíveis no editor, consulte [Editor de Metadados — Guia Completo de Uso e Funcionalidades](/wedocs-5.2/weknow-client/cadastros-gerais/metadados/editor-de-metadados-guia-completo-de-uso-e-funcionalidades.md).
