Wiederverwendung. Gespeicherte Prozeduren können wiederverwendet werden, wodurch die Arbeitsbelastung der Datenbankentwickler verringert wird.
(2) Leistung verbessern. Gespeicherte Prozeduren werden bei ihrer Erstellung kompiliert und müssen bei zukünftiger Verwendung nicht erneut kompiliert werden. Allgemeine SQL-Anweisungen müssen bei jeder Ausführung kompiliert werden, sodass die Verwendung gespeicherter Prozeduren die Effizienz verbessert.
(3) Reduzieren Sie den Netzwerkverkehr. Die gespeicherte Prozedur befindet sich auf dem Server. Beim Aufruf müssen Sie nur den Namen und die Parameter der gespeicherten Prozedur übergeben, wodurch die über das Netzwerk übertragene Datenmenge reduziert wird.
(4) Sicherheit. Parametrisierte gespeicherte Prozeduren können SQL-Injection-Angriffe verhindern, und auf gespeicherte Prozeduren können Berechtigungen zum Gewähren, Verweigern und Widerrufen angewendet werden.
Gespeicherte Prozeduren sind in drei Kategorien unterteilt: benutzerdefinierte gespeicherte Prozeduren, erweiterte gespeicherte Prozeduren und gespeicherte Systemprozeduren.
Unter diesen sind benutzerdefinierte gespeicherte Prozeduren in zwei Typen unterteilt: Transaction-SQL und CLR.
Die gespeicherte Transaction-SQL-Prozedur bezieht sich auf eine gespeicherte Sammlung von Transaction-SQL-Anweisungen, die vom Benutzer bereitgestellte Parameter akzeptieren und zurückgeben können.
Gespeicherte CLR-Prozeduren beziehen sich auf Verweise auf CLR-Methoden (Common Language Runtime) von .Net Framework, die vom Benutzer bereitgestellte Parameter akzeptieren und zurückgeben können. Sie werden als öffentliche statische Methoden von Klassen in .Net Framework-Assemblys implementiert.
Die Anweisung zum Erstellen einer gespeicherten Prozedur lautet wie folgt:
Der zitierte Inhalt lautet:
CREATE { PROCEDURE } [schema_name.] procedure_name [ ; type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ [ OUT [ PUT ]
] [ ,n ]
[ WITH
[schema_name]: Stellt den Namen des Schemas dar, zu dem die gespeicherte Prozedur gehört
Zum Beispiel:
Schema yangyang8848 erstellen
Los
As Select * From Master_goods
GO
Ausführung: Exec yangyang8848.AllGoods wird korrekt ausgeführt.
[;Nummer]: Optionale Ganzzahl, die zum Gruppieren von Prozeduren mit demselben Namen verwendet wird. Verwenden Sie eine DROP PROCEDURE-Anweisung, um diese gruppierten Prozeduren gemeinsam zu löschen.
Zum Beispiel:
Proc S1 ;1 erstellen
* Aus Master_Goods auswählen
Los
Proc S1 ;2 erstellen
Als
* Aus auswählen Master_Location
Go
hat zwei gespeicherte Prozeduren erstellt. Sie befinden sich in derselben Gruppe S1. Wenn Exec S1 ausgeführt wird, führt die gespeicherte Prozedur standardmäßig Exec S1 aus;1. Wenn wir alle Basisinformationen erhalten möchten, müssen wir Exec S1;2 ausführen. Wenn wir eine gespeicherte Prozedur löschen möchten, können wir nur Drop Exec S1 ausführen und alle gespeicherten Prozeduren in der Gruppe werden gelöscht.
[@Parameter]: Parameter in der gespeicherten Prozedur, sofern beim Definieren des Parameters kein Standardwert vorhanden ist oder der Parameter einem anderen Parameter entspricht, muss der Benutzer dem Parameter beim Aufruf der gespeicherten Prozedur einen Wert zuweisen.
Die gespeicherte Prozedur kann bis zu 2100 Parameter haben.
Proc yangyang8848.OneGoods erstellen
@GoodsCode varchar(10)
Als
Wählen Sie * From Master_Goods Where GoodsCode = @GoodsCode
Go
Call Code:
@Code varchar deklarieren (10)
Set @Code = '0004'
Exec yangyang8848.OneGoods @Code
Das Hinzufügen von Output nach dem Parameter zeigt an, dass der Parameter ein Ausgabeparameter ist.
Proc yangyang8848.OneGoods erstellen
@GoodsCode2 varchar(10) Ausgabe,@GoodsCode varchar(10) = '0011'
Als
Wählen Sie * aus Master_Goods, wobei GoodsCode = @GoodsCode
Setzen Sie @ GoodsCode2 = '0005'
Go
Aufrufmethode:
Declare @VV2 varchar(10)
Exec yangyang8848.OneGoods @Code out
Hinweis: Wenn einer der beiden Parameter der gespeicherten Prozedur hat einen Standardwert Wenn es keinen Wert gibt, müssen wir den Standardwert hinten einfügen, sonst gibt es Probleme~~
Vorsichtige Freunde sehen möglicherweise einige Unterschiede in den obigen Anweisungen. Beispielsweise verwendet die gespeicherte Prozedur die Ausgabe , und der Aufruf Die Anweisung verwendet out. Ich bin hier, um Ihnen zu sagen, dass beides gleich ist.
[RECOMPILE]: Weist die Datenbank-Engine an, den Plan für diese Prozedur, der zur Laufzeit kompiliert wird, nicht zwischenzuspeichern. Diese Option kann nicht verwendet werden, wenn FOR REPLICATION angegeben ist. Für gespeicherte CLR-Prozeduren kann RECOMPILE nicht angegeben werden.
Dies ist eine sehr nützliche Funktion. OBJECT_ID: Gibt die Datenbankobjektidentifikationsnummer des Objekts im Geltungsbereich des Schemas zurück.
例如:我们创建存储过程时,可以如下写代码
Wenn Object_ID('yangyang8848.OneGoods') nicht ist Drop Proc yangyang8848.OneGoods
Go
Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Los
Für die oben gespeicherte Prozedur rufen wir die folgende SQL-Abfrage auf
Wählen Sie die Definition aus sys.sql_modules
Where object_id = Object_ID('yangyang8848.OneGoods');
Aber wenn wir [ENCRYPTION] zur gespeicherten Prozedur hinzufügen, werden Sie keine Ergebnisse sehen können
Löschen Sie Proc yangyang8848.OneGoods
Los
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'
Als
Wählen Sie * From Master_Goods WHERE GoodsCode = @GoodScode
Setzen Sie @GOODSCODE2 = '0005'
Los
Dann überprüfen wir die Verzeichnisansicht sys.sql_modules, die Ihnen Null zurückgibt.
Sie erhalten folgende Ergebnisse: Der Text für Objekt 'yangyang8848.OneGoods' ist verschlüsselt.
An dieser Stelle sollten Sie verstehen, dass der Parameter [ENCRYPTION]: eine Verschlüsselungsfunktion ist, die den Originaltext der CREATE PROCEDURE-Anweisung in ein Fuzzy-Format konvertiert. Die Ausgabe des verschleierten Codes kann in keiner Katalogansicht in SQL Server 2005 direkt angezeigt werden. Benutzer ohne Zugriff auf Systemtabellen oder Datenbankdateien können verschleierten Text nicht abrufen. Dieser Text kann jedoch von privilegierten Benutzern mit Zugriff auf Systemtabellen über den DAC-Port oder direktem Zugriff auf Datenbankdateien verwendet werden. Darüber hinaus können Benutzer, die einen Debugger an einen Serverprozess anhängen können, den entschlüsselten Prozess zur Laufzeit aus dem Speicher abrufen.
Ich habe vor zwei Tagen einen Einführungsartikel über Cursor geschrieben. Hier ist ein Beispiel für die Verwendung von Cursorn mit gespeicherten Prozeduren:
If Object_ID('dbo.GetMasterGoods') Is Not Null
Drop Proc dbo. GetMasterGoods
Go
Proc erstellen GetMasterGoods
@MyCursor Cursor Variierende Ausgabe
Mit Verschlüsselung
Als
Set @MyCursor =. Cursor
> Warenname von Master_Goods
Öffnen Sie @MyCursor
As
Declare @GoodsName nvarchar(20)
Declare @MasterGoodsCursor Cursor Exec GetMasterGoods @MasterGoodsCursor out
Fetch Next From @ MasterGoodsCursor
While(@@Fetch_Status = 0)
Begin
Begin
Print @GoodsCode + ':' + @GoodsName
End
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
End
Close @MasterGoodsCursor
Deallocate @MasterGoodsCursor
Go
Das Endergebnis der Ausführung von Exec GetAllGoodsIDAndName ist der folgende Inhalt:
0003:Artikel 0003
0004:Artikel 0004
0005:123123
0007:Artikel 0007
0008:Artikel 008 0009: Produkt 0009
0010: Produkt 0010
0011: Artikel 0011
0012: Artikel 0012
0013: Artikel 0013
0014: Artikel 0014