APPLY (Azure Stream Analytics)
L'opérateur APPLY vous permet d'appeler une fonction table pour chaque ligne retournée par l'expression de table externe d'une requête. La fonction table agit en tant qu'entrée droite et l'expression de table externe en tant qu'entrée gauche. L’entrée appropriée est évaluée pour chaque ligne à partir de l’entrée de gauche, et les lignes produites sont combinées pour la sortie finale. La liste des colonnes produites par l'opérateur APPLY correspond au jeu de colonnes de l'entrée gauche suivi de la liste des colonnes retournées par l'entrée droite.
Il existe deux formes d'opérateurs APPLY : CROSS APPLY et OUTER APPLY.
L'opérateur CROSS APPLY retourne uniquement les lignes de la table externe produisant un jeu de résultats à partir de la fonction table. Le résultat d’un CROSS APPLY ne peut pas être utilisé comme valeur cible du TIMESTAMP BY. Toutefois, vous pouvez utiliser un travail Azure Stream Analytics qui effectue l’opération CROSS APPLY, et utiliser un deuxième travail pour effectuer l’opération TIMESTAMP BY.
L'opérateur OUTER APPLY retourne les lignes produisant un jeu de résultats ainsi que les lignes ne produisant pas un tel ensemble, des valeurs NULL étant indiquées dans les colonnes produites à partir de la fonction table.
Deux fonctions table sont disponibles dans Azure Stream Analytics pour faciliter l’utilisation des champs Array et Type d’enregistrement. Il s’agit de GetArrayElements et GetRecordProperties.
Syntaxe
<input> {CROSS | OUTER} APPLY <elements_selector>
<input> ::= input_name | input_alias
<elements_selector> ::=
{GetArrayElements | GetRecordProperties} (<column_name>) AS element_name
Arguments
input_name | input_alias
Nom ou alias du flux d'entrée.
column_name
Nom d'une colonne du flux d'entrée.
element_name
Nom de la nouvelle colonne contenant le résultat de la fonction table.
Types de retour
La sortie est un enregistrement contenant la charge utile initiale et un enregistrement « element_name », qui contient le résultat de la fonction table.
Pour la fonction GetArrayElements, le résultat sera un enregistrement avec deux champs :
ArrayIndex : index de l’élément dans le tableau
ArrayValue : valeur de l’élément dans le tableau.
Pour la fonction GetRecordProperties, le résultat est un enregistrement avec deux champs :
PropertyName : nom de la propriété dans l’enregistrement.
PropertyValue : valeur de la propriété dans l’enregistrement.
Exemples
Dans cet exemple, en étendant le scénario de péage, nous partons du principe que les voitures peuvent avoir plusieurs plaques d’immatriculation (par exemple, une voiture remorquant une remorque en aurait deux). Cross/outer apply peut être utilisé pour aplatir ce tableau, c'est-à-dire pour obtenir une ligne par plaque d'immatriculation.
CREATE TABLE input(TollId nvarchar(max), EntryTime datetime, Licenses array)
SELECT e.TollId, e.EntryTime, flat.ArrayValue AS licensePlate
FROM input AS e
CROSS APPLY GetArrayElements(e.Licenses) AS flat
Vous pouvez modifier la requête pour utiliser outer apply afin d'effectuer également le suivi des voitures sans plaque d'immatriculation.
SELECT e.TollId, e.EntryTime,
flat.ArrayValue AS licensePlate, flat.ArrayIndex AS licensePlateIndex
FROM input AS e
OUTER APPLY GetArrayElements(e.Licenses) AS flat
Autre exemple utilisant des tableaux imbriqués (tableau de tableaux).
WITH firstQuery AS (
SELECT input.TollId, input.EntryTime,
flat.ArrayIndex AS i1, flat.ArrayValue AS licenses
FROM input
CROSS APPLY GetArrayElements(input.ArrayOfArray) AS flat)
SELECT firstQuery.TollId, firstQuery.EntryTime, firstQuery.i1,
flat2.ArrayIndex AS i2, flat2.ArrayValue AS license
FROM firstQuery
CROSS APPLY GetArrayElements(firstQuery.licenses) AS flat2