Condividi tramite


APPLY (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 opera come input destro, mentre l'espressione di tabella esterna opera come input sinistro. L'input di destra viene valutato per ogni riga dell'input di sinistra e le righe prodotte vengono combinate per l'output finale. L'elenco di colonne prodotto dall'operatore APPLY corrisponde al set di colonne nell'input sinistro seguito dall'elenco di colonne restituito dall'input destro.

L'operatore APPLY è disponibile in due forme, ovvero CROSS APPLY e 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'applicazione CROSS NON può essere usato 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.

L'operatore OUTER APPLY restituisce le righe che producono un set di risultati e quelle che non producono alcun set di risultati, con valori NULL nelle colonne prodotte dalla funzione con valori di tabella.

Esistono due funzioni con valori di tabella disponibili in Analisi di flusso di Azure 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.

Esempio

In questo esempio, estendendo lo scenario di pedaggio, si presuppone che le auto possano avere più di una targa di licenza (ad esempio, un'auto a rimorchio avrebbe due). Gli operatori Cross/Outer apply possono essere usati per rendere flat questa matrice, ad esempio per 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 per usare Outer apply anche per tenere traccia delle automobili 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  
  

Di seguito è riportato un altro esempio di uso di matrici nidificate (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