

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Clause SET
<a name="iot-sql-set"></a>

Utilisez la clause SET pour définir les variables qui stockent les résultats des expressions. Vous pouvez réutiliser ces variables dans les clauses SELECT et WHERE, ainsi que dans les modèles de substitution. Cela vous permet d'éviter de dupliquer des expressions complexes et de réduire le nombre d'appels de fonction dans votre instruction SQL.

La clause SET prend en charge les [variables [Types de données](iot-sql-data-types.md)[Opérateurs](iot-sql-operators.md)[Fonctions](iot-sql-functions.md)[Littéraux](iot-sql-literals.md)](#iot-sql-set-usage),[Instructions Case](iot-sql-case.md),[Extensions JSON](iot-sql-json.md),,, et[Requêtes d'objets imbriqués](iot-sql-nested-queries.md).

## Syntaxe de la clause SET
<a name="iot-sql-set-syntax"></a>

La clause SET doit apparaître avant la clause SELECT dans votre instruction SQL. Utilisez la syntaxe suivante :

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

Règles de syntaxe :
+ Commencez les noms de variables par `@`
+ Les noms de variables peuvent contenir des lettres, des chiffres et des traits de soulignement
+ Les noms de variables peuvent comporter jusqu'à 64 caractères
+ Plusieurs variables peuvent être définies dans une seule clause SET, séparées par des virgules
+ Chaque variable ne peut être affectée qu'une seule fois (les variables sont immuables)
+ Le mot clé SET ne peut être utilisé qu'une seule fois par instruction SQL

## Utilisation de variables
<a name="iot-sql-set-usage"></a>

Après avoir défini les variables, vous pouvez les utiliser dans :
+ CLAUSES SELECT
+ clauses WHERE
+ Autres assignations de variables SET
+ Modèles de substitution d'actions
+ Modèles de substitution d'actions en cas d'erreur
+ Requêtes SELECT imbriquées
+ Paramètres de fonction (certains paramètres tels que les paramètres ROLearn et les paramètres qui changent le mode d'une fonction de manière similaire à ceux qui `transform("enrichArray", attributes, values)` ne prennent pas en charge les variables)

Les variables sont référencées selon la même `@variable_name` syntaxe que celle utilisée dans la clause SET. Vous pouvez également utiliser la syntaxe d'extension JSON pour accéder aux propriétés des variables contenant des objets, telles que`@variable_name.property`.

## Exemples de clauses SET
<a name="iot-sql-set-examples"></a>

**Utilisation des variables de base**

L'exemple suivant montre une charge utile publiée sur le sujet `device/data` : `{"temp_fahrenheit": 75, "humidity": 60}`

Instruction SQL :

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

Charge utile sortante : `{"celsius": 23.89, "humidity": 60}`

**Accès aux membres dans les objets JSON intégrés**

L'exemple suivant montre une charge utile publiée sur le sujet `device/data` : `{"device1": {"deviceId":"weather_sensor", "deviceData": {"sensors": {"temp_fahrenheit": 75, "humidity": 60}, "location": [47.606,-122.332]}}}`

Instruction 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'
```

Charge utile sortante : `{"temp_fahrenheit":75,"humidity":60,"deviceId":"weather_sensor"}`

 pour plus d'informations sur l'utilisation des extensions JSON, consultez [Extensions JSON](iot-sql-json.md) 

**Éviter les appels de fonction dupliqués**

Les variables SET permettent d'éviter de dupliquer des opérations de décodage complexes :

```
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
```

Sans les variables SET, vous devrez répéter la fonction de décodage trois fois, ce qui dépasse les limites d'appels de fonction.

**Variables multiples**

Vous pouvez définir plusieurs variables dans une seule clause SET en les séparant par des virgules :

```
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
```

**Utilisation de variables dans les modèles de substitution**

Les variables peuvent également être utilisées dans les modèles de substitution d'actions, ce qui vous permet de réutiliser les valeurs calculées à la fois dans l'instruction SQL et dans les actions de règle.

Instruction SQL :

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

Configuration de l'action :

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

Dans cet exemple, la variable SET `@temp_celsius` est utilisée dans un modèle de substitution pour construire le champ clé de l'action S3.

**Utilisation de charges utiles non JSON**

Les variables SET ne prennent pas directement en charge les charges utiles non JSON. Par conséquent, la charge utile doit d'abord être codée ou décodée :

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

 pour plus d'informations sur la façon de travailler avec des charges utiles non JSON, reportez-vous à [Utilisation des charges utiles binaires](binary-payloads.md) 

## Limites de la clause SET
<a name="iot-sql-set-limits"></a>

Les limites suivantes s'appliquent aux variables SET :
+ Maximum de 10 variables uniques par instruction SQL
+ Taille de valeur variable maximale de 128 KiB (chaîne UTF-8 JSON minifiée)
+ Valeur totale maximale de 128 KiB pour toutes les variables
+ Noms de variables limités à 64 caractères
+ Les variables peuvent accepter les charges utiles JSON directement telles quelles (les charges utiles non JSON doivent d'abord être encodées/décodées)