SQLShack (Italiano)
I cursori di SQL Server sono un argomento comune su Internet . Troverai opinioni diverse su quando usarli e quando non farlo. Oggi parleremo anche di loro e risponderemo alla domanda quando (non) usarli.
Il modello di dati e lidea generale
Nellarticolo precedente, Introduzione a SQL Loop del server, abbiamo parlato dei loop di SQL Server, ma non abbiamo utilizzato i dati dal database. Era strano, ma ora dovrebbe diventare molto più chiaro. Oggi, spiegando i cursori, useremo i dati dal database per mostrare quando (non) usare i cursori. Il modello di dati che utilizzeremo è lo stesso che stiamo utilizzando in questa serie.
SQL Server supporta 3 diverse implementazioni di cursori: cursori Transact-SQL, cursori API e cursori client. In questo articolo, ci concentreremo sui cursori Transact-SQL. Li riconoscerai facilmente perché sono basati sulla sintassi DECLARE CURSOR.
SQL Server Cursor – Introduzione
Prima di passare al codice e agli esempi, dovremmo spiegare quali sono i cursori di SQL Server sono.
Il cursore di SQL Server è la logica T-SQL, che ci consente di scorrere il risultato della query correlata. Ciò ci consente di eseguire le azioni in sequenza, ad esempio eseguire un aggiornamento su una singola riga.
A volte questo potrebbe (sembrare) utile, ma quando si lavora con i database, non è necessario utilizzare schemi di programmazione procedurale ma piuttosto attenersi alla programmazione dichiarativa. Uno dei motivi principali è che i DBMS sono già ottimizzati per eseguire azioni su set di dati, e quindi non dovresti essere tu quello che sta cercando di essere “più intelligente del sistema”.
Tuttavia, va bene per sapere come funzionano. Se non altro, forse li incontrerai nel codice che erediti e dovrai riscrivere la logica. E prima di fare qualsiasi cosa, dovresti capire come funziona.
Quindi, se hai bisogno di cursori, questo è quello che dovresti sapere su di loro:
- I cursori usano le variabili per memorizzare i valori restituiti in ogni parte del ciclo. Pertanto, dovrai DECLARE tutte le variabili di cui avrai bisogno
- La prossima cosa da fare è DICHIARARE … CURSORE PER SELEZIONA query, dove dichiarerai un cursore e definirai anche la query relativa (popolando) quel cursore
- APRIRE il cursore e FETCH NEXT dal cursore
- Nel ciclo WHILE testerai la variabile @@ FETCH_STATUS (WHILE @@ FETCH_STATUS = 0). Se la condizione è valida, entrerò nel ciclo BEGIN … END blocca ed esegui le istruzioni allinterno di quel blocco
- Dopo aver eseguito un ciclo attraverso lintero set di risultati, uscirai dal ciclo. Dovresti CHIUDERE il cursore e DEALLOCARLO. La deallocazione è importante perché eliminerà la definizione del cursore e libererà la memoria utilizzata
Cursore di SQL Server – Esempi
Diamo ora uno sguardo a due esempi di cursore. Sebbene siano piuttosto semplici, spiegano bene come funzionano i cursori.
Nel primo esempio, vogliamo ottenere tutti gli ID e i nomi delle città, insieme ai nomi dei paesi correlati. Useremo il comando PRINT per stampare le combinazioni in ogni passaggio del ciclo.
Utilizzando il cursore di SQL Server e il mentre il ciclo ha restituito esattamente ciò che ci aspettavamo: ID e nomi di tutte le città e paesi correlati, che abbiamo nel database.
La cosa più importante da menzionare qui è che potremmo semplicemente restituire questo set di risultati utilizzando la query SQL originale memorizzata nella parte DECLARE del cursore, quindi non cera bisogno di un cursore.
Andremo con un altro esempio. Questa volta interrogheremo il database dello schema delle informazioni per restituire le prime 5 tabelle ordinate in base al nome della tabella. Anche se non ha molto senso usare una simile query, questo esempio mostra:
- Come interrogare il database dello schema delle informazioni
- Come combinare alcuni comandi / istruzioni che noi menzionato in articoli precedenti (IF… ELSE, WHILE loop, CONCAT)
Dal lato del codice, Vorrei sottolineare che questa volta non abbiamo stampato nulla in un ciclo, ma piuttosto abbiamo creato una stringa usando CONCAT. Inoltre, abbiamo utilizzato listruzione IF per verificare se siamo nel primo passaggio e, in tal caso, non abbiamo aggiunto “,”. Altrimenti, aggiungeremmo “,” alla stringa.
Dopo il ciclo, abbiamo stampato la stringa del risultato, chiuso e deallocato il cursore.
Potremmo ottenere ciò utilizzando la funzione STRING_AGG. Questo è disponibile a partire da SQL Server 2017 ed è lequivalente della funzione MySQL GROUP_CONCAT.
SQL Server Cursor – Quando (non) usarli?
Proverò a dare una risposta oggettiva alla domanda: “Quando utilizzare i cursori SQL Server e quando no”? Poiché le cose cambiano nel tempo e devono essere apportati miglioramenti, sia sui cursori, sia su altri oggetti che li “sostituiscono”, prendere in considerazione la data in cui questo articolo è stato scritto.Quindi, iniziamo.
Non dovresti usare i cursori:
- Quasi sempre 🙂 Potrebbe sembrare stupido, ma è vero nella maggior parte dei casi. SQL Server implementa un gran numero di funzioni di oggetti & che fanno esattamente ciò che probabilmente proveresti a risolvere utilizzando i cursori. Prima di decidere di andare con il cursore, assicurati di aver studiato abbastanza per concludere che il cursore è lunica soluzione possibile (buona). Lo stesso sta per i loop nei database. Nellarticolo precedente, Introduzione ai loop di SQL Server, abbiamo utilizzato i loop, ma non per scorrere i dati.
Potresti usare i cursori:
- Principalmente per attività di amministrazione del database come backup, controlli di integrità, ricostruzione di indici
- Per una volta task quando sei sicuro che una possibile scarsa prestazione non influirà sulle prestazioni complessive del sistema
-
Chiamare una procedura memorizzata alcune volte utilizzando parametri diversi. In tal caso, si otterrebbero parametri dalle variabili del cursore e si effettueranno chiamate allinterno del ciclo
La chiamata di una procedura memorizzata o di unaltra query allinterno del cursore (o del ciclo) influisce molto sulle prestazioni, perché, in ogni passaggio del ciclo del cursore, eseguirai la query / procedura dallinizio. Se decidi di farlo, dovresti essere consapevole delle possibili conseguenze.
- Il suggerimento precedente ci porta allultimo punto in cui dovresti usare i cursori. Se sei completamente consapevole di come funzionano e sei abbastanza sicuro che non influirà sulle prestazioni, provaci
Cursore di SQL Server – Perché le persone (non) li usano ?
Lultima domanda a cui vorrei rispondere è: perché qualcuno dovrebbe usare un cursore? Ecco come la vedo io:
- Le persone che li utilizzano per lavori occasionali o azioni regolari in cui non influiscono sulle prestazioni hanno la scusa. Uno dei motivi è che tale codice è codice procedurale e, se ci sei abituato, è molto leggibile
- Daltra parte, coloro che hanno iniziato a conoscere i database e sono abituati alla programmazione procedurale potrebbero utilizzare i cursori perché, come detto, sono molto più vicini alla programmazione procedurale che ai database. Questo non è un motivo per usarli, perché lunica scusa qui sarebbe che semplicemente non conosci laltro (giusto) modo di fare le cose
- La cosa più importante dei cursori è che sono lenti rispetto alle istruzioni SQL e quindi dovresti evitare di usarle perché prima o poi porteranno a problemi di prestazioni (a meno che tu non sappia esattamente cosa stai facendo e perché)
I trova utile che tu capisca il concetto di cursori perché cè una grande possibilità che tu li incontri lungo la strada. Erano popolari prima che alcune nuove opzioni fossero aggiunte a SQL Server. Inoltre, cè la possibilità che continuerai a lavorare su un sistema in cui qualcuno prima di utilizzarli e dovrai continuare da dove si erano fermati. Forse dovrai sostituire il cursore (codice procedurale) con SQL (codice dichiarativo).
Conclusione
Non cè conclusione migliore sui cursori, che – non usarli 🙂 SQL Server ha implementato molte modifiche che risolvono problemi che prima erano difficili da risolvere utilizzando codice dichiarativo. È meglio dedicare un po di tempo alla ricerca e allapprendimento di qualcosa di nuovo e, infine, alla produzione di codice ottimale. Ovviamente puoi usarli se sai perché lo fai e sei consapevole dei possibili problemi ad essi correlati.
Sommario
Impara SQL : CREATE DATABASE & CREATE TABLE Operazioni
Impara SQL: INSERISCI NELLA TABELLA
Impara SQL: chiave primaria
Impara SQL: chiave esterna
Impara SQL: istruzione SELECT
Impara SQL: INNER JOIN vs LEFT JOIN
Impara SQL: script SQL
Impara SQL: tipi di relazioni
Impara SQL: unisci più tabelle
Impara SQL: funzioni aggregate
Impara SQL: come scrivere una query SELECT complessa?
Impara SQL: il database INFORMATION_SCHEMA
Impara SQL: tipi di dati SQL
Impara SQL: Teoria degli insiemi
Apprendimento di SQL: funzioni definite dallutente
Apprendimento di SQL: procedure memorizzate definite dallutente
Apprendimento di SQL: viste SQL
Impara SQL: trigger SQL
Impara SQL: pratica query SQL
Impara SQL: esempi di query SQL
Impara SQL: crea un rapporto manualmente utilizzando query SQL
Impara SQL: funzioni data e ora di SQL Server
Impara SQL: crea rapporti SQL Server utilizzando le funzioni di data e ora
Impara SQL: tabelle pivot di SQL Server
Impara SQL: esportazione di SQL Server in Excel
Impara SQL: Introduzione ai loop di SQL Server
Impara SQL: Cursori di SQL Server
Impara SQL: Best practice per SQL per leliminazione e laggiornamento dei dati
Impara SQL: convenzioni di denominazione
Impara SQL: processi relativi a SQL
Impara SQL: join non equi in SQL Server
Impara SQL: SQL Injection
- Autore
- Post recenti
I suoi impegni passati e presenti variano dalla progettazione e codifica di database allinsegnamento, alla consulenza e alla scrittura di database. Inoltre, non dimenticare, BI, creazione di algoritmi, scacchi, filatelia, 2 cani, 2 gatti, 1 moglie, 1 bambino …
Lo trovi su LinkedIn
Visualizza tutti i post di Emil Drkusic
- Learn SQL: SQL Injection – 2 novembre 2020
- Learn SQL: Non-Equi Joins in SQL Server – 29 settembre 2020
- Learn SQL: Lavori relativi a SQL – 1 settembre 2020