Section courante

A propos

Section administrative du site

 Langage  Installation  Elément  Tutoriel  GUI  Outils  Déployer  Annexe  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
Rust
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Planification de l'installation
Planification d'une migration
SQL Server 2005 Developer
SQL Server 2008 R2 Developer
SQL Server 2012 Developer
SQL Server 2014 Developer
SQL Server 2016 Developer
SQL Server 2017 Developer
SQL Server 2019 Developer
Introduction
Type de données élémentaire
Les instructions de boucles
Référence des mots réservés
Référence des instructions
Référence des fonctions
Référence des bases de données systèmes
Référence des tables systèmes
Référence des vues systèmes
Référence des utilisateurs par défaut
Référence des Stored Procedures système
Objets de base du SQL
Gérer les données avec Transact-SQL
Langage de définition de données/Data Definition Language (DDL)
Instructions DML : Instructions INSERT, UPDATE, DELETE et MERGE
Recherche en texte intégral (Full-Text Search)
Prise en charge de JSON dans SQL Server
STORED PROCEDURES
Les opérations
Activer l'intégration de SQL Server de CLR à l'aide de Transact-SQL
Afficher l'historique des requêtes SQL
Afficher tous les index dans une base de données SQL Server
Afficher toutes les tables dans une base de données
Comment identifier les requêtes SQL d'exécution lente dans SQL Server
Exporter la base de données SQL Server dans un fichier SQL
Exporter des tables dans un fichier .SQL avec Microsoft SQL Server Management Studio
Obtenir le nom du serveur et des bases de données dans SQL Server
SQL Server Management Studio (SSMS)
DBeaver
HeidiSQL
Navicat
SQL Server Analytic Services (SSAS)
SQL Server Data Tools (SSDT)
SQL Server Integration Services (SSIS)
SQL Server Reporting Services (SSRS)
sqlcmd
SQL Data Compare (Redgate)
SSIS avec SQL Server Management Studio (SSMS)
SSIS avec Visual Studio 2017
Références des codes d'erreur du SQL Server
Référence de termes et du vocabulaire
Préface
Notes légal
Dictionnaire
Recherche

STORED PROCEDURES

Les STORED PROCEDURE sont des routines prenant en charge le flux avec plusieurs étapes. Ils prennent en charge de nombreux éléments T-SQL que les fonctions définies par l'utilisateur ne prennent pas, comme la modification des données dans la base de données et même l'application de modifications de définition de données aux objets de base de données (DLL), à l'aide de tables temporaires, de SQL dynamique, de gestion des erreurs,... Ce sont des avantages évidents par rapport aux fonctions définies par l'utilisateur, les STORED PROCEDURE ne peuvent pas être intégrées dans les requêtes.

Les STORED PROCEDURE prennent en charge les paramètres d'entrée et de sortie et peuvent également renvoyer des ensembles de résultats de requêtes. Le SQL Server met en cache les plans d'exécution des requêtes de la STORED PROCEDURE et les réutilise généralement dans les exécutions ultérieures de la procédure pour économiser le temps, les ressources de microprocesseur et mémoire associées à l'optimisation des requêtes.

Les STORED PROCEDURE offrent de nombreux avantages par rapport à l'implémentation de la logique métier dans l'application. Ils encapsulent la logique pour permettre la réutilisation et la dissimulation de la complexité. Il est beaucoup plus facile d'appliquer des modifications à une STORED PROCEDURE avec une simple commande ALTER PROC que de déployer des modifications dans l'application. De plus, avec les STORED PROCEDURE, vous avez tendance à avoir moins de trafic réseau car lorsque vous appelez une STORED PROCEDURE à partir de l'application, tout ce qui est transmis via le réseau n'est que le nom de la procédure et ses paramètres. Le flux s'exécute dans le moteur de base de données, puis seul le résultat final est envoyé à l'application. Lorsque vous implémentez la logique dans l'application, vous obtenez généralement plus d'allers-retours entre l'application et la base de données, et par conséquent plus de trafic réseau.

Les STORED PROCEDURE simplifient également la gestion de la sécurité dans la base de données. Souvent, vous ne souhaitez pas accorder aux utilisateurs des autorisations pour interroger et modifier directement les données dans les tables, mais vous souhaitez plutôt qu'ils puissent effectuer ces tâches uniquement directement via des STORED PROCEDURE. Pour ce faire, accordez aux utilisateurs des autorisations EXECUTE sur la STORED PROCEDURE sans leur accorder un accès direct aux objets sous-jacents.

Travailler avec des STORED PROCEDURES

Une STORED PROCEDURES est une routine réutilisable prenant en charge les paramètres d'entrée et de sortie, et renvoie même des ensembles de résultats de requêtes.

Supposons que l'on vous confie la tâche de créer une STORED PROCEDURES gérant ce que l'on appelle des conditions de recherche dynamique pour interroger et filtrer les données de la table Ventes.Commandes. La procédure doit avoir quatre paramètres d'entrée facultatifs pour filtrer la commande par d'identificateur de commande, date de commande, identificateur de client et identificateur d'employé. L'utilisateur exécutant détermine par quelle combinaison de colonnes filtrer. La façon dont vous rendez les paramètres d'entrée facultatifs est de les définir avec un NULL par défaut. Si l'utilisateur ne spécifie pas de valeur pour un paramètre d'entrée, il est défini sur la valeur NULL par défaut, vous indiquant que vous n'êtes pas censé appliquer un filtre à la colonne correspondante.

Exécutez le code suivant pour créer la STORED PROCEDURES DemandeCommande, gérant la tâche à accomplir :

  1. CREATE OR ALTER PROC dbo.DemandeCommande
  2.  @NoCommande   AS INT = NULL,
  3.  @DateCommande AS DATE = NULL,
  4.  @NoClient     AS INT = NULL,
  5.  @NoEmployee   AS INT = NULL
  6.  
  7. AS
  8.  
  9. SET XACT_ABORT, NOCOUNT ON;
  10.  
  11. SELECT NoCommande, DateCommande, DateExpedition, NoClient, NoEmployee, NoExpedition FROM dbo.Ventes.Commandes
  12. WHERE (NoCommande = @NoCommande OR @NoCommande IS NULL)
  13.   AND (DateCommande = @DateCommande OR @DateCommande IS NULL)
  14.   AND (NoClient = @NoClient OR @NoClient IS NULL)
  15.   AND (NoEmployee = @NoEmployee OR @NoEmployee IS NULL);
  16.   
  17. GO

Observez l'entête de la STORED PROCEDURE avec la définition des paramètres d'entrée et la syntaxe pour définir les valeurs par défaut. Certaines personnes aiment placer les définitions de paramètres entre parenthèses, comme dans :

  1. CREATE OR ALTER PROC dbo.DemandeCommande
  2. (
  3.  @NoCommande   AS INT = NULL,
  4.  @DateCommande AS DATE = NULL,
  5.  @NoClient     AS INT = NULL,
  6.  @NoEmployee   AS INT = NULL
  7. )
  8. AS

En ce qui concerne la STORED PROCEDURE, notez qu'il n'y a pas de bloc BEGIN-END obligatoire comme dans les fonctions définies par l'utilisateur à plusieurs instructions, mais vous pouvez en utiliser un si c'est votre préférence de style, comme dans :

  1. BEGIN
  2.    SET XACT_ABORT, NOCOUNT ON;
  3.  
  4.    SELECT NoCommande, DateCommande, DateExpedition, NoClient, NoEmployee, NoExpedition FROM dbo.Ventes.Commandes
  5.    WHERE (NoCommande = @NoCommande OR @NoCommande IS NULL)
  6.      AND (DateCommande = @DateCommande OR @DateCommande IS NULL)
  7.      AND (NoClient = @NoClient OR @NoClient IS NULL)
  8.      AND (NoEmployee = @NoEmployee OR @NoEmployee IS NULL);
  9. END;

Le code de la STORED PROCEDURE commence par définir l'option XACT_ABORT et NOCOUNT sur ON. L'option XACT_ABORT détermine l'effet des erreurs d'exécution générées par les instructions T-SQL. Lorsque cette option est désactivée (valeur par défaut dans la plupart des cas), certaines erreurs provoquent l'annulation d'une transaction ouverte et l'annulation de l'exécution du code, tandis que d'autres laissent la transaction ouverte. Pour obtenir un comportement plus fiable et cohérent, il est considéré comme une bonne pratique de définir cette option sur ON, et de cette façon, toutes les erreurs provoquent l'annulation d'une transaction ouverte et l'annulation de l'exécution du code. L'option NOCOUNT supprime les messages indiquant le nombre de lignes affectées par les instructions de manipulation de données. Lorsqu'il est désactivé (par défaut), ces messages peuvent dégrader les performances des requêtes en raison du trafic réseau qu'ils génèrent, ce qui cause des problèmes aux applications clientes les percevant comme des résultats de requêtes.

Le code appelle ensuite une requête sur la table Ventes.Commandes filtrant les données en fonction des paramètres spécifiés. Pour chaque paramètre, la clause WHERE de la requête a la disjonction de prédicats suivante (prédicats séparés par l'opérateur OR) :

  1. colonne = @parametre OR @parametre IS NULL

Lorsque l'utilisateur ne spécifie pas de valeur d'entrée, le paramètre est défini sur la valeur NULL par défaut. Dans un tel cas, le prédicat @parametre est NULL est vrai, et donc la disjonction des prédicats est vraie, donc aucun filtrage n'est appliqué. Lorsque l'utilisateur spécifie une valeur d'entrée, le prédicat @parametre IS NULL est faux et il appartient au prédicat colonne = @parameter de déterminer s'il faut conserver la ligne ou la supprimer.

Exécutez le code suivant pour tester la procédure, demandant de filtrer les commandes passées le 1 novembre 2021 par le client 74 :

  1. EXEC dbo.DemandeCommande @DateCommande = '20211101', @NoClient = 74;


PARTAGER CETTE PAGE SUR
Dernière mise à jour : Lundi, le 1er novembre 2021