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
Emil è un professionista del database con oltre 10 anni di esperienza in tutto ciò che riguarda i database. Negli anni ha lavorato nel settore IT e finanziario e ora lavora come libero professionista.
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

Ultimi post di Emil Drkusic (vedi tutti)
  • 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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *