

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Cláusula SET
<a name="iot-sql-set"></a>

Use a cláusula SET para definir variáveis que armazenam resultados de expressões. Você pode reutilizar essas variáveis nas cláusulas SELECT e WHERE e em modelos de substituição. Isso ajuda a evitar a duplicação de expressões complexas e a reduzir o número de chamadas de função em sua instrução SQL.

A cláusula SET suporta [Tipos de dados](iot-sql-data-types.md)[Operadores](iot-sql-operators.md),[Funções](iot-sql-functions.md),[Literais](iot-sql-literals.md),[Declarações de caso](iot-sql-case.md),,[Extensões JSON](iot-sql-json.md), [Variáveis](#iot-sql-set-usage) e. [Consultas de objeto aninhado](iot-sql-nested-queries.md)

## Sintaxe da cláusula SET
<a name="iot-sql-set-syntax"></a>

A cláusula SET deve aparecer antes da cláusula SELECT em sua instrução SQL. Use a seguinte sintaxe:

```
SET @variable_name = expression [, @variable_name2 = expression2]
```

Regras de sintaxe:
+ Inicie os nomes das variáveis com `@`
+ Os nomes das variáveis podem conter letras, números e sublinhados
+ Os nomes das variáveis podem ter até 64 caracteres
+ Várias variáveis podem ser definidas em uma única cláusula SET, separadas por vírgulas
+ Cada variável só pode ser atribuída uma vez (as variáveis são imutáveis)
+ A palavra-chave SET só pode ser usada uma vez por instrução SQL

## Usando variáveis
<a name="iot-sql-set-usage"></a>

Depois de definir as variáveis, você pode usá-las em:
+ Cláusulas SELECT
+ Cláusulas WHERE
+ Outras atribuições de variáveis SET
+ Modelos de substituição de ações
+ Modelos de substituição de ações de erro
+ Consultas SELECT aninhadas
+ Parâmetros de função (certos parâmetros, como parâmetros do RoLearn e parâmetros que alternam o modo de uma função semelhante a `transform("enrichArray", attributes, values)` que não suportam variáveis)

As variáveis são referenciadas usando a mesma `@variable_name` sintaxe usada na cláusula SET. Você também pode usar a sintaxe da extensão JSON para acessar propriedades de variáveis que contêm objetos, como. `@variable_name.property`

## Exemplos da cláusula SET
<a name="iot-sql-set-examples"></a>

**Uso básico de variáveis**

O exemplo a seguir mostra uma carga publicada no tópico`device/data`: `{"temp_fahrenheit": 75, "humidity": 60}`

Declaração do SQL:

```
SET @temp_celsius = (temp_fahrenheit - 32) * 5 / 9
SELECT @temp_celsius AS celsius, humidity FROM 'device/data'
```

Carga útil de saída: `{"celsius": 23.89, "humidity": 60}`

**Acesse membros em objetos JSON incorporados**

O exemplo a seguir mostra uma carga publicada no tópico`device/data`: `{"device1": {"deviceId":"weather_sensor", "deviceData": {"sensors": {"temp_fahrenheit": 75, "humidity": 60}, "location": [47.606,-122.332]}}}`

Declaração do SQL:

```
SET @device_sensor_data = device1.deviceData.sensors
SELECT @device_sensor_data.temp_fahrenheit AS temp_fahrenheit, @device_sensor_data.humidity as humidity, device1.deviceId as deviceId FROM 'device/data'
```

Carga útil de saída: `{"temp_fahrenheit":75,"humidity":60,"deviceId":"weather_sensor"}`

 para obter mais informações sobre como trabalhar com extensões JSON, consulte [Extensões JSON](iot-sql-json.md) 

**Evitando chamadas de função duplicadas**

As variáveis SET ajudam a evitar a duplicação de operações complexas de decodificação:

```
SET @decoded_data = decode(encode(*, 'base64'), 'proto', 'schema', 'schema.desc', 'message.proto', 'Message')
SELECT @decoded_data.sensor_id, @decoded_data.reading FROM 'device/protobuf' 
WHERE @decoded_data.reading > 100
```

Sem as variáveis SET, você precisaria repetir a função de decodificação três vezes, o que excede os limites de chamada da função.

**Várias variáveis**

Você pode definir várias variáveis em uma única cláusula SET separando-as com vírgulas:

```
SET @user_data = get_user_properties(device_id), @threshold = 50
SELECT @user_data.name, temp_fahrenheit FROM 'sensors/+'
WHERE temp_fahrenheit > @threshold AND @user_data.active = true
```

**Usando variáveis em modelos de substituição**

As variáveis também podem ser usadas em modelos de substituição de ações, permitindo que você reutilize valores computados nas ações da instrução SQL e da regra.

Declaração do SQL:

```
SET @temp_celsius = (temp_fahrenheit - 32) * 5 / 9
SELECT @temp_celsius AS celsius, humidity FROM 'device/data'
```

Configuração da ação:

```
{
  "s3": {
    "roleArn": "arn:aws:iam::123456789012:role/testRuleRole",
    "bucketName": "bucket",
    "key": "temperature-data/${device_id}/temp-${@temp_celsius}C.json"
  }
}
```

Neste exemplo, a variável SET `@temp_celsius` é usada em um modelo de substituição para construir o campo chave da ação S3.

**Uso de carga útil não JSON**

As variáveis SET não oferecem suporte direto a cargas não JSON, portanto, a carga deve ser codificada ou decodificada primeiro:

```
SET @encoded_payload = encode(*, 'base64')
SELECT @encoded_payload AS raw_data FROM 'device/binary'
```

 para obter mais informações sobre como trabalhar com cargas não JSON, consulte [Como trabalhar com cargas úteis binárias](binary-payloads.md) 

## Limites da cláusula SET
<a name="iot-sql-set-limits"></a>

Os limites a seguir se aplicam às variáveis SET:
+ Máximo de 10 variáveis exclusivas por instrução SQL
+ Tamanho máximo do valor variável de 128 KiB (string JSON UTF-8 minificada)
+ Tamanho máximo do valor total de 128 KiB para todas as variáveis
+ Nomes de variáveis limitados a 64 caracteres
+ As variáveis podem aceitar cargas JSON diretamente como estão (cargas não JSON devem primeiro ser codificadas/decodificadas)