Condividi tramite


APPLICARE

✅ Flusso di eventi dell'infrastruttura di Analisi ✅ di flusso di Azure

L'operatore APPLY consente di richiamare una funzione con valori di tabella per ogni riga restituita da un'espressione di tabella esterna di una query. La funzione con valori di tabella funge da input destro e l'espressione di tabella esterna funge da input sinistro. L'input destro viene valutato per ogni riga dall'input sinistro e le righe prodotte vengono combinate per l'output finale. L'elenco di colonne prodotte dall'operatore APPLY è il set di colonne nell'input sinistro seguito dall'elenco di colonne restituite dall'input destro.

Esistono due forme di APPLY: CROSS APPLY ed OUTER APPLY.

L'operatore CROSS APPLY restituisce solo le righe della tabella esterna che producono un set di risultati dalla funzione con valori di tabella. Il risultato di un CROSS APPLY non può essere utilizzato come valore di destinazione di TIMESTAMP BY. Tuttavia, è possibile usare un processo di Analisi di flusso di Azure che esegue CROSS APPLY e usare un secondo processo per eseguire TIMESTAMP BY.

OUTER APPLY restituisce entrambe le righe che producono un set di risultati e righe che non lo fanno, con valori NULL nelle colonne generate dalla funzione con valori di tabella.

In Analisi di flusso di Azure sono disponibili due funzioni con valori di tabella per facilitare l'uso dei campi Matrice e Tipo di record. Sono GetArrayElements e GetRecordProperties.

Sintassi

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

Argomenti

input_name | input_alias

Nome o alias del flusso di input.

column_name

Nome di una colonna del flusso di input.

element_name

Nome della nuova colonna contenente il risultato della funzione con valori di tabella.

Tipi restituiti

L'output è un record contenente il payload iniziale e un record 'element_name', che contiene il risultato della funzione con valori di tabella.

Per la funzione GetArrayElements il risultato sarà un record con due campi:

  • ArrayIndex: indice dell'elemento nella matrice

  • ArrayValue: valore dell'elemento nella matrice.

Per la funzione GetRecordProperties il risultato sarà un record con due campi:

  • PropertyName: nome della proprietà nel record.

  • PropertyValue: valore della proprietà nel record.

Esempi

In questo esempio, estendendo lo scenario del casello, si presuppone che le auto possano avere più di una targa (ad esempio, un'auto che sta per trainare un rimorchio avrebbe due). L'applicazione incrociata/esterna può essere usata per appiattire questa matrice, ad esempio ottenere una riga per ogni targa.

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  
  

La query può essere modificata in modo da utilizzare l'applicazione esterna per tenere traccia anche delle auto senza targa.

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

Un altro esempio usa matrici annidate (matrice di matrici).

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