Risultati dell'elaborazione (ODBC)

Dopo l'invio di un'istruzione SQL da parte di un'applicazione, SQL Server restituisce eventuali dati risultanti come uno o più set di risultati. Un set di risultati è un set di righe e colonne che corrispondono ai criteri della query. Le istruzioni SELECT, le funzioni di catalogo e alcune stored procedure producono un set di risultati reso disponibile a un'applicazione in formato tabulare. Se l'istruzione SQL eseguita è una stored procedure, un batch contenente più comandi o un'istruzione SELECT contenente parole chiave, ad esempio COMPUTE o COMPUTE BY, il numero di set di risultati da elaborare sarà maggiore.

Anche le funzioni di catalogo ODBC possono recuperare dati. La funzione SQLColumns, ad esempio, recupera dati relativi alle colonne nell'origine dati. Questi set di risultati possono contenere zero o più righe.

Le altre istruzioni SQL, ad esempio GRANT o REVOKE, non restituiscono set di risultati. Per queste istruzioni, il codice restituito da SQLExecute o SQLExecDirect è in genere la sola indicazione di un'esecuzione corretta dell'istruzione.

Ogni istruzione INSERT, UPDATE e DELETE restituisce un set di risultati contenente solo il numero di righe modificate. Questo conteggio viene reso disponibile quando l'applicazione chiama SQLRowCount. Le applicazioni ODBC 3.x devono chiamare SQLRowCount per recuperare il set di risultati o SQLMoreResults per annullarlo. Quando un'applicazione esegue un batch o una stored procedure che contiene più istruzioni INSERT, UPDATE o DELETE, il set di risultati proveniente da ogni istruzione di modifica deve essere elaborato utilizzando SQLRowCount o annullato utilizzando SQLMoreResults. Questi conteggi possono essere annullati includendo un'istruzione SET NOCOUNT ON nel batch o nella stored procedure.

Transact-SQL include l'istruzione SET NOCOUNT. Quando è impostata l'opzione NOCOUNT, SQL Server non restituisce i conteggi delle righe interessate da un'istruzione e SQLRowCount restituisce 0. La versione del driver ODBC di SQL Server Native Client introduce un'opzione SQLGetStmtAttr specifica del driver, SQL_SOPT_SS_NOCOUNT_STATUS, per segnalare se l'opzione NOCOUNT è attivata o disattivata. Quando SQLRowCount restituisce 0, l'applicazione deve testare SQL_SOPT_SS_NOCOUNT_STATUS. Se viene restituito SQL_NC_ON, il valore 0 di SQLRowCount indica solo che SQL Server non ha restituito un conteggio delle righe. Se viene restituito SQL_NC_OFF, NOCOUNT è disattivato e il valore 0 di SQLRowCount indica che l'istruzione non ha influito sulle righe. Quando SQL_SOPT_SS_NOCOUNT_STATUS è SQL_NC_OFF, le applicazioni non dovrebbero visualizzare il valore di SQLRowCount. Le stored procedure o i batch di grandi dimensioni possono contenere più istruzioni SET NOCOUNT, pertanto i programmatori non possono presupporre che SQL_SOPT_SS_NOCOUNT_STATUS rimanga costante. L'opzione deve essere testata ogni volta che SQLRowCount restituisce 0.

Diverse altre istruzioni Transact-SQL restituiscono nei messaggi dati anziché set di risultati. Quando il driver ODBC di SQL Server Native Client riceve questi messaggi, restituisce SQL_SUCCESS_WITH_INFO per indicare all'applicazione che sono disponibili messaggi informativi. L'applicazione può quindi chiamare SQLGetDiagRec per recuperare tali messaggi. Le istruzioni Transact-SQL che funzionano in questo modo sono:

  • DBCC

  • SET SHOWPLAN (disponibile con versioni precedenti di SQL Server)

  • SET STATISTICS

  • PRINT

  • RAISERROR

Il driver ODBC di SQL Server Native Client restituisce SQL_ERROR in caso di RAISERROR con gravità 11 o superiore. Se la gravità di RAISERROR è 19 o superiore, viene anche interrotta la connessione.

Per elaborare i set di risultati da un'istruzione SQL, l'applicazione:

  • Determina le caratteristiche del set di risultati.

  • Associa le colonne a variabili di programma.

  • Recupera un valore singolo, un'intera riga di valori o più righe di valori.

  • Verifica se sono presenti altri set di risultati e, in caso affermativo, esegue il ciclo all'indietro per determinare le caratteristiche del nuovo set di risultati.

Il processo che consente di recuperare le righe dall'origine dati e di restituirle alle applicazioni viene denominato recupero.

Recupero di set di risultati COMPUTE e COMPUTE BY

La clausola COMPUTE BY genera subtotali all'interno di un set di risultati, mentre la clausola COMPUTE genera un totale alla fine del set di risultati. Il driver ODBC di SQL Server Native Client presenta tali totali e subtotali all'applicazione chiamante generando più set di risultati per ogni istruzione SELECT.

Nell'esempio seguente vengono utilizzati COMPUTE BY per generare subtotali e COMPUTE per generare un totale:

SELECT Title = CONVERT(char(20), title), type, price, advance
FROM Titles
WHERE ytd_sales IS NOT NULL
  AND type LIKE '%cook%'
ORDER BY type DESC
COMPUTE AVG(price), SUM(advance) BY type
COMPUTE SUM(price), SUM(advance)

Queste istruzioni determinano un calcolo del subtotale per il prezzo medio e la somma degli anticipi per ogni tipo di libro, quindi una somma finale complessiva dei dati relativi a prezzi e anticipi. Il driver presenta il primo set di risultati per le righe dai libri del primo tipo. Produce quindi un secondo set di risultati con le due colonne COMPUTE BY per AVG(price) e SUM(advance) per questo primo set di libri. Produce quindi un terzo set di risultati per il successivo gruppo di libri e un quarto set di risultati con i subtotali COMPUTE BY per tale gruppo. Il driver interfaccia questi set di risultati fino a produrre il set di risultati finale con il totale per la clausola COMPUTE SUM(price), SUM(advance).