Una stored procedure è un gruppo di istruzioni SQL compilate in una. Le stored procedure possono includere business logic e altri costrutti di programmazione.
In SQL Server, una stored procedure è un gruppo di una o più istruzioni Transact-SQL o un riferimento a un metodo CLR (Common Runtime Language) di Microsoft .NET Framework.
Programmabilità
Ma una procedura memorizzata è più di un semplice script lungo. È uno script che è stato salvato in SQL Server in particolare nelle Stored Procedure nodo e può:
- Accetta i parametri di input (e restituisce più valori sotto forma di parametri di output al programma chiamante).
- Contengono istruzioni di programmazione.
- Restituisce un valore di stato a un programma chiamante per indicare l'esito positivo o negativo e il motivo di qualsiasi errore.
Le stored procedure spesso contengono logica aziendale. Ad esempio, una procedura memorizzata può accettare i parametri che le vengono passati e confrontarli con questi parametri usando IF
dichiarazioni. Ad esempio, se il parametro è un valore, fallo, se è un altro valore, fallo.
Le stored procedure possono migliorare le prestazioni in un'applicazione, poiché la stored procedure viene analizzata e ottimizzata non appena viene creata e quindi archiviata in memoria. L'esecuzione di una query condizionale tramite stored procedure può essere estremamente rapida, rispetto a un'applicazione che invia una query attraverso la rete, a SQL Server, quindi riceve tutti i dati restituiti attraverso la rete in modo che possa filtrarla e selezionarla solo i record a cui è interessato.
Vantaggi delle stored procedure
Di seguito sono riportati alcuni dei principali vantaggi nell'utilizzo delle stored procedure:
Vantaggio | Spiegazione |
---|---|
Programmazione modulare | Puoi scrivere una stored procedure una volta, quindi richiamarla ancora e ancora, da parti diverse di un'applicazione (e anche da più applicazioni). |
Prestazioni | Le stored procedure forniscono un'esecuzione più rapida del codice e riducono il traffico di rete.
|
Sicurezza | Gli utenti possono eseguire una procedura memorizzata senza dover eseguire direttamente nessuna delle istruzioni. Pertanto, una procedura memorizzata può fornire funzionalità di database avanzate per utenti che normalmente non avrebbero accesso a queste attività, ma questa funzionalità è resa disponibile in modo strettamente controllato. |
Come creare una stored procedure
Per creare una procedura memorizzata, utilizzare CREATE PROCEDURE
istruzione, seguita dal codice che costituisce la stored procedure. Se la tua procedura memorizzata accetterà parametri, devono essere inclusi dopo il nome.
CREATE PROCEDURE myStoredProcedure AS ... OR CREATE PROCEDURE myStoredProcedure @ParameterName DataType AS ...
Ora creeremo una procedura memorizzata basata su una delle viste che abbiamo creato in precedenza: RecentAlbums visualizza.
Questa visualizzazione restituisce tutti gli album pubblicati negli ultimi 20 anni. Questo va bene fintanto che sarà necessario guardare indietro di 20 anni. Ma cosa succede se si desidera che l'utente scelga quanti anni deve coprire?
Una procedura memorizzata può risolvere questo problema.
Creeremo una procedura memorizzata che accetta un parametro. Il valore del parametro sarà il numero di anni di cui eseguire la ricerca. Pertanto, questo valore può essere specificato dall'utente ogni volta che esegue la procedura memorizzata.
-
Progetta la stored procedure
Apri una nuova finestra di query e aggiungi il codice per la procedura memorizzata.
Nel nostro caso, copieremo/incolleremo il codice da RecentArtists visualizzare e modificare la parte superiore, in modo che diventi una stored procedure.
Aggiungeremo un parametro chiamato
@Count
che determinerà quanti anni la stored procedure dovrebbe guardare indietro.Quindi sostituiremo il valore hardcoded di
20
con@Count
Codice campione
Ecco il codice del nostro esempio:
CREATE PROCEDURE spRecentAlbums @Count int AS SELECT Albums.ReleaseDate, Albums.AlbumName, Genres.Genre, Artists.ArtistName, Artists.ActiveFrom FROM Albums INNER JOIN Artists ON Albums.ArtistId = Artists.ArtistId INNER JOIN Genres ON Albums.GenreId = Genres.GenreId WHERE (Albums.ReleaseDate > DATEADD(year, - @Count, GETDATE()));
-
Crea la stored procedure
Quando tutto sembra a posto, puoi eseguire l'istruzione per creare la procedura memorizzata.
Fai clic su Esegui per creare la procedura memorizzata.
Una volta creata la procedura memorizzata, puoi vederla in Esplora oggetti (potrebbe essere necessario aggiornare le Procedure memorizzate prima il nodo).
-
Esegui la procedura archiviata
Ora che è stato creato, puoi eseguire la stored procedure.
Apri una nuova finestra di query, aggiungi questo:
EXEC spRecentAlbums @Count = 5;
Ora fai clic su Esegui dalla barra degli strumenti.
La stored procedure restituirà tutti gli album pubblicati negli ultimi 5 anni.
-
Prova diversi parametri
Prova a modificare il valore del parametro per vedere come ciò influisca sui risultati.
Puoi anche eseguire più istruzioni una dopo l'altra. Apparirà un nuovo riquadro dei risultati per ogni affermazione.
Modello di stored procedure
In SQL Server 2016, puoi creare una stored procedure facendo clic con il pulsante destro del mouse su Stored procedure nodo in Esplora oggetti e selezionando Nuovo> Stored procedure... o Nuovo> stored procedure compilate in modo nativo... .
Si aprirà un modello pronto per essere popolato con la tua procedura specifica.
Esegui una stored procedure tramite la GUI
È inoltre possibile utilizzare l'interfaccia utente grafica per eseguire una procedura memorizzata.
-
Avvia la Esegui procedura Finestra di dialogo
In Esplora oggetti, fai clic con il pulsante destro del mouse sulla stored procedure e seleziona Esegui stored procedure... .
-
Parametri di fornitura
Immettere un valore per tutti i parametri richiesti dalla procedura memorizzata, quindi fare clic su OK .
-
I risultati
I risultati vengono visualizzati.
Modificare una stored procedure
Se hai bisogno di modificare una stored procedure esistente, sostituisci semplicemente CREATE
con ALTER
(insieme alla procedura aggiornata).
Questo esempio modifica la stored procedure in modo che i risultati vengano ordinati in base alla data di rilascio in ordine decrescente:
ALTER PROCEDURE spRecentAlbums @Count int AS SELECT Albums.ReleaseDate, Albums.AlbumName, Genres.Genre, Artists.ArtistName, Artists.ActiveFrom FROM Albums INNER JOIN Artists ON Albums.ArtistId = Artists.ArtistId INNER JOIN Genres ON Albums.GenreId = Genres.GenreId WHERE (Albums.ReleaseDate > DATEADD(year, - @Count, GETDATE())) ORDER BY Albums.ReleaseDate DESC;
Procedure archiviate di sistema
SQL Server include un gran numero di stored procedure di sistema per facilitare le attività di amministrazione del database. Molte delle attività che è possibile eseguire tramite la GUI possono essere eseguite tramite una stored procedure di sistema. Ad esempio, alcune delle operazioni che puoi eseguire con le stored procedure di sistema includono:
- Configura account di sicurezza
- Configura server collegati
- Crea un piano di manutenzione del database
- Crea cataloghi di ricerca full-text
- Aggiungi accesso remoto
- Configura replica
- Imposta lavori pianificati
- e molto altro...
Le stored procedure di sistema sono precedute da sp_ , quindi è meglio evitare di utilizzare quel prefisso per le tue procedure.
Convenzioni di denominazione
È una buona idea sviluppare una convenzione di denominazione coerente per le tue stored procedure (e per tutti gli altri oggetti nel tuo database).
Alcune persone antepongono alle loro stored procedure usp_ (per indicare una procedura memorizzata definita dall'utente), altri la iniziano con una parola chiave SQL come select , inserisci , aggiornamento , elimina . Altri usano un'abbreviazione per l'applicazione.
Alcuni usano i trattini bassi per separare ogni parola nella procedura memorizzata (ad esempio, recent_albums ), mentre altri utilizzeranno le maiuscole e minuscole (ad esempio, RecentAlbums ).
Pertanto, è possibile che la nostra procedura memorizzata possa essere denominata in uno dei seguenti modi, a seconda della convenzione di denominazione utilizzata.
- Album recenti
- album_recenti
- uspRecentAlbums
- usp_recent_albums
- seleziona Album recenti
- seleziona_Album recenti
- select_recent_albums
- getRecentAlbums
- get_recent_albums
Ottieni l'immagine. L'importante è la coerenza. Scegline uno e mantienilo. Semplificherà l'utilizzo di una procedura memorizzata. Immagina di avere punteggi, o anche centinaia di stored procedure, e ogni volta che vai a eseguirne uno, devi accedervi in Esplora oggetti semplicemente perché non riesci a ricordare se l'hai chiamato usp_RecentAlbums o uspRecentAlbums .
Come accennato, evita di usare sp_ come prefisso per i nomi delle procedure memorizzate. SQL Server utilizza questo prefisso per le stored procedure di sistema.
SQL Server esegue prima la ricerca nelle stored procedure di sistema, quindi, nella migliore delle ipotesi, subirai un calo delle prestazioni. Nel peggiore dei casi, la tua procedura non verrà eseguita (se condivide un nome con una stored procedure di sistema).