APPLY (Azure Stream Analytics)

Der APPLY-Operator ermöglicht Ihnen das Aufrufen einer Tabellenwertfunktion für sämtliche Zeilen, die von einem äußeren Ausdruck einer Tabelle einer Abfrage zurückgegeben werden. Die Tabellenwertfunktion dient als rechte Eingabe, der äußere /Ausdruck der Tabelle agiert als linke Eingabe. Die rechte Eingabe wird für jede Zeile aus der linken Eingabe ausgewertet, und die erstellten Zeilen werden für die endgültige Ausgabe kombiniert. Bei der Liste der vom APPLY-Operator erstellten Spalten handelt es sich um die Reihe von Spalten in der linken Eingabe, gefolgt von der Liste der von der rechten Eingabe zurückgegebenen Spalten.

Es gibt zwei Formen von APPLY: CROSS APPLY und OUTER APPLY.

CROSS APPLY gibt nur Zeilen von der äußeren Tabelle zurück, die ein Resultset der Tabellenwertfunktion erstellen. Das Ergebnis eines CROSS APPLY-Werts kann nicht als Zielwert von TIMESTAMP BY verwendet werden. Sie können jedoch einen Azure Stream Analytics-Auftrag verwenden, der CROSS APPLY ausführt, und einen zweiten Auftrag verwenden, um TIMESTAMP BY auszuführen.

OUTER APPLY gibt sowohl Zeilen, die ein Resultset erstellen als auch solche Zeilen zurück, bei denen dies nicht der Fall ist. Durch die Tabellenwertfunktion werden hierbei in den Spalten NULL-Werte erstellt.

In Azure Stream Analytics stehen zwei Tabellenwertfunktionen zur Verfügung, um die Arbeit mit Array- und Datensatztypfeldern zu vereinfachen. Sie sind GetArrayElements und GetRecordProperties.

Syntax

  
<input> {CROSS | OUTER} APPLY <elements_selector>  
  
<input> ::= input_name |  input_alias  
  
<elements_selector> ::=   
{GetArrayElements | GetRecordProperties} (<column_name>) AS element_name  
  

Argumente

input_name | input_alias

Der Name oder Alias des Eingabedatenstroms.

column_name

Der Name einer Spalte des Eingabedatenstroms.

element_name

Der Name der neuen Spalte, die das Ergebnis der Tabellenwertfunktion enthält.

Rückgabetypen

Die Ausgabe ist ein Datensatz, der die anfängliche Nutzlast und einen Datensatz "element_name" enthält, der das Ergebnis der Tabellenwertfunktion enthält.

Für die GetArrayElements-Funktion ist das Ergebnis ein Datensatz mit zwei Feldern:

  • ArrayIndex: Der Index des Elements im Array

  • ArrayValue: Der Wert des Elements im Array.

Für die GetRecordProperties-Funktion ist das Ergebnis ein Datensatz mit zwei Feldern:

  • PropertyName: Der Name der Eigenschaft im Datensatz.

  • PropertyValue: Der Wert der Eigenschaft im Datensatz.

Beispiele

In diesem Beispiel gehen wir bei der Erweiterung des Mautgebührenszenarios davon aus, dass Autos mehr als ein Nummernschild haben können (z. B. ein Auto, das einen Anhänger abschleppt, hätte zwei). Cross/outer apply kann verwendet werden, um dieses Array zu reduzieren, d. h. eine Zeile pro Nummernschild abrufen.

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  
  

Die Abfrage kann geändert werden, um outer apply zu verwenden, um auch Autos ohne Nummernschild verfolgen zu können.

SELECT e.TollId, e.EntryTime,   
flat.ArrayValue AS licensePlate, flat.ArrayIndex AS licensePlateIndex  
   FROM input AS e   
   OUTER APPLY GetArrayElements(e.Licenses) AS flat  
  

Ein anderes Beispiel für die Verwendung geschachtelter Arrays (Arrays von Arrays).

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