Condividi tramite


Identificatori (Entity SQL)

Gli identificatori sono utilizzati in Entity SQL per rappresentare alias di espressioni di query, riferimenti a variabili, proprietà degli oggetti, funzioni e così via. In Entity SQL sono disponibili due tipi di identificatori: identificatori semplici e identificatori tra virgolette.

Identificatori semplici

Un identificatore semplice in Entity SQL è una sequenza di caratteri alfanumerici e di sottolineatura. Il primo carattere dell'identificatore deve essere un carattere alfabetico (a-z o A-Z).

Identificatori tra virgolette

Un identificatore tra virgolette è una qualsiasi sequenza di caratteri racchiusi tra parentesi quadre ([]). Gli identificatori tra virgolette consentono di specificare gli identificatori con caratteri che non sono validi negli identificatori. Tutti i caratteri racchiusi tra le parentesi quadre diventano parte dell'identificatore, inclusi tutti gli spazi vuoti.

Un identificatore tra virgolette non può includere i caratteri seguenti:

  • Carattere di nuova riga.

  • Ritorno a capo.

  • Tabulazione.

  • Backspace.

  • Parentesi quadre aggiuntive (ovvero, parentesi quadre all'interno delle parentesi quadre che delineano l'identificatore).

Un identificatore tra virgolette può includere caratteri Unicode.

Gli identificatori tra virgolette consentono di creare caratteri per i nomi delle proprietà non validi negli identificatori, come illustrato nell'esempio seguente:

SELECT c.ContactName AS [Contact Name] FROM customers AS c

È inoltre possibile utilizzare gli identificatori tra virgolette per specificare un identificatore che corrisponde a una parola chiave riservata di Entity SQL. Se, ad esempio, il tipo Email dispone di una proprietà denominata "From", è possibile evitare l'ambiguità con la parola chiave riservata FROM utilizzando parentesi quadre, come illustrato di seguito:

SELECT e.[From] FROM emails AS e

È possibile utilizzare un identificatore tra virgolette sul lato destro di un operatore punto (.)

SELECT t FROM ts as t WHERE t.[property] == 2

Per utilizzare la parentesi quadra in un identificatore, aggiungere un'ulteriore parentesi quadra. Nell'esempio seguente "abc]" è l'identificatore:

SELECT t from ts as t WHERE t.[abc]]] == 2

Per la semantica di confronto dell'identificatore tra virgolette, vedere Set di caratteri di input (Entity SQL).

Regole relative all'utilizzo degli alias

È consigliabile specificare gli alias nelle query Entity SQL tutte le volte che ciò è necessario, incluso nel caso dei costrutti Entity SQL seguenti:

  • Campi di un costruttore ROW.

  • Elementi nella clausola FROM di un'espressione di query.

  • Elementi nella clausola SELECT di un'espressione di query.

  • Elementi nella clausola GROUP BY di un'espressione di query.

Alias validi

Tutti gli identificatori semplici o tra virgolette sono alias validi in Entity SQL.

Generazione di alias

Se in un'espressione di query Entity SQL non è specificato alcun alias, Entity SQL tenta di generare un alias in base alle semplici regole seguenti:

  • Se l'espressione di query (per la quale l'alias non è specificato) è un identificatore semplice o tra virgolette, tale identificatore viene utilizzato come alias. ROW(a, [b])diventa, ad esempio ROW(a AS a, [b] AS [b]).

  • Se l'espressione di query è un'espressione più complessa, ma l'ultimo componente dell'espressione è un identificatore semplice, tale identificatore viene utilizzato come alias. ROW(a.a1, b.[b1])diventa, ad esempio ROW(a.a1 AS a1, b.[b1] AS [b1]).

Si consiglia di non utilizzare alias impliciti se successivamente si desidera utilizzare il nome dell'alias. Tutte le volte che gli alias (impliciti o espliciti) sono in conflitto o vengono ripetuti nello stesso ambito, si verifica un errore di compilazione. Un alias implicito può essere compilato anche se è presente un alias esplicito o implicito con lo stesso nome.

Gli alias impliciti vengono generati automaticamente in base all'input dell'utente. La riga di codice seguente consente ad esempio di generare NAME come alias per entrambe le colonne, creando pertanto un conflitto.

SELECT product.NAME, person.NAME

Anche la riga di codice seguente, in cui vengono utilizzati alias espliciti, provoca la generazione di un errore. L'errore risulta tuttavia più evidente leggendo il codice.

SELECT 1 AS X, 2 AS X …

Regole di ambito

In Entity SQL vengono definite regole di ambito che determinano quando determinate variabili sono visibili nel linguaggio di query. Alcune espressioni o istruzioni introducono nuovi nomi. Le regole di ambito determinano dove possono essere utilizzati tali nomi, nonché quando o dove una nuova dichiarazione con lo stesso nome di un'altra può nascondere il relativo predecessore.

Quando i nomi vengono definiti in una query Entity SQL, si dice che vengono definiti in un ambito. Un ambito include l'intera area della query. I nomi definiti in un ambito sono visibili per tutte le espressioni o i riferimenti ai nomi inclusi in tale ambito. Prima dell'inizio di un ambito e dopo la sua fine, non è possibile fare riferimento ai nomi definiti nell'ambito.

Gli ambiti possono essere nidificati. Parti di Entity SQL introducono nuovi ambiti che coprono intere aree e tali aree possono contenere altre espressioni Entity SQL che introducono anch'esse ambiti. Quando gli ambiti sono nidificati, è possibile fare riferimento ai nomi definiti nell'ambito più interno, che contiene il riferimento. È inoltre possibile fare riferimento a qualsiasi nome definito in qualsiasi ambito esterno. Due ambiti qualsiasi definiti all'interno dello stesso ambito sono considerati ambiti di pari livello. Non è possibile fare riferimento ai nomi definiti in ambiti di pari livello.

Se un nome dichiarato in un ambito interno corrisponde a un nome dichiarato in un ambito esterno, i riferimenti nell'ambito interno o negli ambiti dichiarati all'interno di tale ambito riguardano solo il nome appena dichiarato. Il nome nell'ambito esterno è nascosto.

Anche all'interno dello stesso ambito non è possibile fare riferimento ai nomi prima che vengano definiti.

I nomi globali possono esistere come parte dell'ambiente di esecuzione. Sono inclusi nomi di variabili di ambiente o insiemi persistenti. Per essere globale, un nome deve essere dichiarato nell'ambito più esterno.

I parametri non sono inclusi in un ambito. Poiché i riferimenti ai parametri includono una sintassi speciale, i nomi di parametri non sono mai in conflitto con gli altri nomi nella query.

Espressioni di query

Un'espressione di query Entity SQL introduce un nuovo ambito. I nomi definiti nella clausola FROM vengono introdotti nell'ambito FROM in base all'ordine con cui appaiono, da sinistra verso destra. Nell'elenco di join, le espressioni possono fare riferimento ai nomi definiti precedentemente nell'elenco. Le proprietà pubbliche (campi e così via) degli elementi identificati nella clausola FROM non vengono aggiunte all'ambito FROM. Per fare riferimento a queste proprietà è sempre necessario utilizzare il nome completo dell'alias. In genere, tutte le parti dell'espressione SELECT vengono considerate all'interno dell'ambito FROM.

La clausola GROUP BY introduce inoltre un nuovo ambito di pari livello. Ogni gruppo può avere un nome che fa riferimento all'insieme di elementi nel gruppo. Ogni espressione di raggruppamento introduce inoltre un nuovo nome nell'ambito GROUP. Viene inoltre eseguita l'aggiunta all'ambito dell'aggregazione nidificata o del gruppo denominato. Le espressioni di raggruppamento si trovano all'interno dell'ambito FROM. Quando tuttavia viene utilizzata una clausola GROUP BY, l'elenco SELECT (proiezione), la clausola HAVING e la clausola ORDER BY sono considerati inclusi nell'ambito GROUP e non nell'ambito FROM. Per le aggregazioni viene utilizzata una modalità di gestione speciale, come descritto nel seguente elenco puntato.

Di seguito sono riportate alcune note aggiuntive relative agli ambiti:

  • L'elenco SELECT può introdurre nuovi nomi nell'ambito, in ordine. Le espressioni di proiezione a destra possono riferirsi ai nomi proiettati a sinistra.

  • La clausola ORDER BY può fare riferimento a nomi (alias) specificati nell'elenco SELECT.

  • L'ordine di valutazione delle clausole nell'espressione SELECT determina l'ordine con cui i nomi vengono introdotti nell'ambito. La clausola FROM viene valutata per prima, seguita dalle clausole WHERE, GROUP BY, HAVING, SELECT e infine ORDER BY.

Gestione delle aggregazioni

Entity SQL supporta due forme di aggregazione: aggregazioni basate sugli insiemi e aggregazioni basate sui gruppi. Le aggregazioni basate sugli insiemi rappresentano il costrutto preferito in Entity SQL, mentre quelle basate sui gruppi sono supportate per offrire compatibilità con SQL.

Quando si risolve un'aggregazione, in Entity SQL viene innanzitutto eseguito un tentativo di gestire l'aggregazione come aggregazione basata sugli insiemi. Se ciò non è possibile, in Entity SQL l'input di aggregazione viene trasformato in un riferimento all'aggregazione nidificata e viene eseguito un tentativo di risolvere questa nuova espressione, come illustrato nell'esempio seguente.

AVG(t.c) becomes AVG(group..(t.c))

Vedere anche

Concetti

Riferimenti a Entity SQL
Panoramica su Entity SQL
Set di caratteri di input (Entity SQL)