Heim > php教程 > PHP开发 > Hauptteil

SQL Server-Grundlagen: Gespeicherte Prozeduren

高洛峰
Freigeben: 2016-12-14 15:08:36
Original
1834 Leute haben es durchsucht

Einfach ausgedrückt ist eine gespeicherte Prozedur eine Sammlung einer oder mehrerer SQL-Anweisungen, die als Batchdatei betrachtet werden kann, ihre Rolle ist jedoch nicht auf die Batchverarbeitung beschränkt. In diesem Artikel werden hauptsächlich die Verwendung von Variablen sowie die Vorgänge zum Erstellen, Aufrufen, Anzeigen, Ändern und Löschen gespeicherter Prozeduren und gespeicherter Funktionen vorgestellt.

1: Übersicht über gespeicherte Prozeduren

Die gespeicherten Prozeduren in SQL Server sind Codesegmente, die mit T_SQL geschrieben wurden. Ihr Zweck besteht darin, auf einfache Weise Informationen aus Systemtabellen abzufragen oder Verwaltungsaufgaben im Zusammenhang mit der Aktualisierung von Datenbanktabellen und anderen Systemverwaltungsaufgaben auszuführen. Die T_SQL-Anweisung ist die Programmierschnittstelle zwischen der SQL Server-Datenbank und dem Anwendungsprogramm. In vielen Fällen werden einige Codes von Entwicklern wiederholt geschrieben. Wenn der Code jedes Mal mit derselben Funktion geschrieben wird, ist dies nicht nur umständlich und fehleranfällig, sondern verringert auch die Betriebseffizienz des Systems, da SQL Server Anweisungen ausführt eins nach dem anderen.

Kurz gesagt handelt es sich bei einer gespeicherten Prozedur darum, dass SQL Server einige feste Operationsanweisungen schreibt, die mehrmals in Programmsegmente aufgerufen werden müssen, um bestimmte Aufgaben zu erfüllen. Diese Programmsegmente werden auf dem Server und in der Datenbank gespeichert Der Server übergibt das aufzurufende Programm.

Vorteile gespeicherter Prozeduren:

Gespeicherte Prozeduren beschleunigen den Systembetrieb. Sie werden nur dann kompiliert, wenn sie erstellt werden, und müssen nicht bei jeder Ausführung neu kompiliert werden.

Gespeicherte Prozeduren können komplexe Datenbankvorgänge kapseln und den Vorgangsprozess vereinfachen, z. B. das Aktualisieren und Löschen mehrerer Tabellen.

Es kann eine modulare Programmierung realisieren und die gespeicherte Prozedur kann mehrfach aufgerufen werden, wodurch eine einheitliche Datenbankzugriffsschnittstelle bereitgestellt und die Wartbarkeit der Anwendung verbessert wird.

Gespeicherte Prozeduren können die Sicherheit des Codes erhöhen. Für Benutzer, die die in der gespeicherten Prozedur referenzierten Objekte nicht direkt bedienen können, kann SQL Server die Ausführungsberechtigungen des Benutzers für die angegebene gespeicherte Prozedur festlegen.

Gespeicherte Prozeduren können den Netzwerkverkehr reduzieren. Der gespeicherte Prozedurcode wird direkt in der Datenbank gespeichert. Während des Kommunikationsprozesses zwischen dem Client und dem Server wird kein großer T_SQL-Codeverkehr generiert.

Nachteile gespeicherter Prozeduren:

Die Datenbanktransplantation ist unpraktisch. Der in gespeicherten SQL Server-Prozeduren gekapselte Operationscode kann nicht direkt auf andere Datenbankverwaltungssysteme übertragen werden.

Unterstützt kein objektorientiertes Design, kann logisches Geschäft nicht objektorientiert kapseln oder sogar ein allgemeines Geschäftslogik-Framework bilden, das Dienste unterstützen kann.

Der Code ist schlecht lesbar und schwer zu pflegen. Clustering wird nicht unterstützt.

2: Klassifizierung gespeicherter Prozeduren

1. Gespeicherte Systemprozedur

Eine gespeicherte Systemprozedur ist eine vom SQL Server-System selbst bereitgestellte gespeicherte Prozedur, die als Befehl verwendet werden kann um verschiedene Operationen durchzuführen.

Systemgespeicherte Prozeduren werden hauptsächlich verwendet, um Informationen aus Systemtabellen abzurufen. Verwenden Sie gespeicherte Systemprozeduren, um die Verwaltung des Datenbankservers abzuschließen, Systemadministratoren zu helfen und Benutzern das Anzeigen von Datenbankobjekten zu erleichtern befindet sich in der Datenbank. Auf dem Server beginnend mit sp_ werden die gespeicherten Systemprozeduren in den systemdefinierten und benutzerdefinierten Datenbanken definiert, und es ist nicht erforderlich, vor der gespeicherten Prozedur beim Aufruf einen datenbankqualifizierten Namen hinzuzufügen. Beispiel: Die gespeicherte Systemprozedur sp_rename kann den Namen eines vom Benutzer erstellten Objekts in der aktuellen Datenbank ändern. Die gespeicherte Prozedur sp_helptext kann Textinformationen zu Regeln, Standardwerten oder -ansichten sowie viele Verwaltungsaufgaben auf dem SQL SERVER-Server anzeigen werden durch die Ausführung gespeicherter Systemprozeduren vervollständigt, viele Systeminformationen können auch durch die Ausführung gespeicherter Systemprozeduren abgerufen werden.

Gespeicherte Systemprozeduren werden im Systemdatenbank-Master erstellt und gespeichert. Einige gespeicherte Systemprozeduren können nur von Systemadministratoren verwendet werden, während andere gespeicherte Systemprozeduren von anderen Benutzern durch Autorisierung verwendet werden können.

2. Vom Benutzer gespeicherte Prozeduren (benutzerdefinierte gespeicherte Prozeduren)

Benutzerdefinierte gespeicherte Prozeduren sind T_SQL, die von Benutzern mithilfe von T_SQL-Anweisungen geschrieben und in die Benutzerdatenbank geschrieben werden, um eine bestimmte Geschäftsanforderung zu erfüllen Benutzerdefinierte gespeicherte Prozeduren können Eingabeparameter akzeptieren, Ergebnisse und Informationen an den Client zurückgeben, Ausgabeparameter zurückgeben usw. Beim Erstellen einer benutzerdefinierten gespeicherten Prozedur bedeutet das Hinzufügen von „##“ vor dem Namen der gespeicherten Prozedur, dass eine globale temporäre gespeicherte Prozedur erstellt wird; das Hinzufügen von „#“ vor der gespeicherten Prozedur zeigt an, dass eine lokale temporäre gespeicherte Prozedur erstellt wird. Eine lokal temporär gespeicherte Prozedur kann nur innerhalb der Sitzung verwendet werden, in der sie erstellt wurde, und wird gelöscht, wenn die Sitzung endet. Beide gespeicherten Prozeduren werden in der Datenbank tempdb gespeichert.

Benutzerdefinierte gespeicherte Prozeduren sind in zwei Kategorien unterteilt: T_SQL und CLR

T_SQL: Gespeicherte Prozeduren sind eine Sammlung wertsparender T_SQL-Anweisungen, die vom Benutzer bereitgestellte Parameter akzeptieren und zurückgeben können Prozeduren können auch Daten von der Datenbank an die Clientanwendung zurückgeben.

Gespeicherte CLR-Prozeduren beziehen sich auf gespeicherte Methodenprozeduren, die auf die gemeinsame Sprache des Microsoft.NET Frameworks verweisen. Sie können vom Benutzer bereitgestellte Parameter akzeptieren und zurückgeben. Sie werden als öffentliche statische Methoden von Klassen in .NET implementiert Rahmenmontage.

3. Erweiterte gespeicherte Prozeduren

Erweiterte gespeicherte Prozeduren werden als dynamische Verbindungen (DLL-Dateien) implementiert, die außerhalb der SQL SERVER-Umgebung ausgeführt werden und in den Adressraum geladen werden können, in dem die SQL SERVER-Instanz ausgeführt wird Zur Ausführung können erweiterte gespeicherte Prozeduren mithilfe der erweiterten gespeicherten Prozeduren von SQL SERVER programmiert werden. Für Benutzer sind erweiterte gespeicherte Prozeduren mit den gespeicherten Mandarin-Prozeduren identisch gleiche Methode.

3: Erstellen Sie eine gespeicherte Prozedur

Wenn Sie Ihre Arbeit gut machen möchten, müssen Sie zunächst Ihre Werkzeuge wie folgt vorbereiten:

use sample_db;
--创建测试books表
create table books (
 book_id int identity(1,1) primary key,
 book_name varchar(20),
 book_price float,
 book_auth varchar(10)
);
--插入测试数据
insert into books (book_name,book_price,book_auth)
 values
 ('论语',25.6,'孔子'),
 ('天龙八部',25.6,'金庸'),
 ('雪山飞狐',32.7,'金庸'),
 ('平凡的世界',35.8,'路遥'),
 ('史记',54.8,'司马迁');
Nach dem Login kopieren

Erstellen Sie eine gespeicherte Prozedur ohne Parameter.

--1.创建无参存储过程
if (exists (select * from sys.objects where name = 'getAllBooks'))
 drop proc proc_get_student
go
create procedure getAllBooks
as
select * from books;
--调用,执行存储过程
exec getAllBooks;
Nach dem Login kopieren

Ändern Sie die Gespeicherte Prozedur

alter procedure dbo.getAllBooks 
as
select book_auth from books;
Nach dem Login kopieren

Gespeicherte Prozedur löschen

drop procedure getAllBooks;
Nach dem Login kopieren

Gespeicherte Prozedur umbenennen

sp_rename getAllBooks,proc_get_allBooks;
Nach dem Login kopieren

Gespeicherte Prozedur mit Parametern erstellen
Es gibt zwei Arten von Parametern für Gespeicherte Prozeduren: Eingabeparameter und Ausgabeparameter

Eingabeparameter: werden zum Übergeben von Werten an gespeicherte Prozeduren verwendet, ähnlich der Werteübergabe in der Java-Sprache oder C.

Ausgabeparameter: werden für die Ergebnisse der Besprechungsteilnahme nach dem Aufruf der gespeicherten Prozedur verwendet, ähnlich der Referenzübergabe in der Java-Sprache.

Der Unterschied zwischen Wertübertragung und Referenzübertragung:

Die Zuweisung zu Basisdatentypen erfolgt durch Wertübertragung; die Zuweisung zwischen Referenztypen erfolgt durch Referenzübertragung.
Wertübergabe übergibt den tatsächlichen Variablenwert; Referenzübergabe übergibt die Referenzadresse des Objekts.
Nach der Übergabe des Werts ändern die beiden Variablen ihre jeweiligen Werte; nach der Übergabe der Referenz ändern die beiden Referenzen den Status desselben Objekts

(1) Gespeicherte Prozedur mit einem Parameter

if (exists (select * from sys.objects where name = 'searchBooks'))
 drop proc searchBooks
go
create proc searchBooks(@bookID int)
as
 --要求book_id列与输入参数相等
 select * from books where book_id=@bookID;
--执行searchBooks
exec searchBooks 1;
Nach dem Login kopieren

(2) Gespeicherte Prozedur mit 2 Parametern

if (exists (select * from sys.objects where name = 'searchBooks1'))
 drop proc searchBooks1
go
create proc searchBooks1(
 @bookID int,
 @bookAuth varchar(20)
)
as
 --要求book_id和book_Auth列与输入参数相等
 select * from books where book_id=@bookID and book_auth=@bookAuth;
exec searchBooks1 1,'金庸';
Nach dem Login kopieren

(3) Gespeicherte Prozedur mit Rückgabewert erstellen

MySQL

if (exists (select * from sys.objects where name = 'getBookId'))
 drop proc getBookId
go
create proc getBookId(
 @bookAuth varchar(20),--输入参数,无默认值
 @bookId int output --输入/输出参数 无默认值
)
as
 select @bookId=book_id from books where book_auth=@bookAuth
--执行getBookId这个带返回值的存储过程
declare @id int --声明一个变量用来接收执行存储过程后的返回值
exec getBookId '孔子',@id output
select @id as bookId;--as是给返回的列值起一个名字
if (exists (select * from sys.objects where name = 'getBookId'))
 drop proc getBookId
go
create proc getBookId(
 @bookAuth varchar(20),--输入参数,无默认值
 @bookId int output --输入/输出参数 无默认值
)
as
 select @bookId=book_id from books where book_auth=@bookAuth
--执行getBookId这个带返回值的存储过程
declare @id int --声明一个变量用来接收执行存储过程后的返回值
exec getBookId '孔子',@id output
select @id as bookId;--as是给返回的列值起一个名字
Nach dem Login kopieren

(4) Speicher mit Platzhalterprozedur erstellen

if (exists (select * from sys.objects where name = 'charBooks'))
 drop proc charBooks
go
create proc charBooks(
 @bookAuth varchar(20)='金%',
 @bookName varchar(20)='%'
)
as 
 select * from books where book_auth like @bookAuth and book_name like @bookName;
--执行存储过程charBooks
exec charBooks '孔%','论%';
Nach dem Login kopieren

(5) Die gespeicherte Verschlüsselungsprozedur

mit der Verschlüsselungsklausel verbirgt den Text der gespeicherten Prozedur vor dem Benutzer. Das folgende Beispiel erstellt einen Verschlüsselungsprozess und verwendet zum Abrufen die gespeicherte Prozedur sp_helptext Informationen zum Verschlüsselungsprozess. Versuchen Sie dann, Informationen über den Prozess direkt aus der Systemkommentartabelle abzurufen.

if (object_id('books_encryption', 'P') is not null)
 drop proc books_encryption
go
create proc books_encryption 
with encryption
as 
 select * from books;
--执行此过程books_encryption
exec books_encryption;
exec sp_helptext 'books_encryption';--控制台会显示"对象 'books_encryption' 的文本已加密。"
Nach dem Login kopieren

(6) (7). Parameter mit Cursors erstellen. Gespeicherte Prozedur

--with recompile不缓存
if (object_id('book_temp', 'P') is not null)
 drop proc book_temp
go
create proc book_temp
with recompile
as
 select * from books;
go
exec book_temp;
exec sp_helptext 'book_temp';
Nach dem Login kopieren

(8). Erstellen Sie eine gespeicherte Paging-Prozedur

if (object_id('book_cursor', 'P') is not null)
 drop proc book_cursor
go
create proc book_cursor
 @bookCursor cursor varying output
as
 set @bookCursor=cursor forward_only static for
 select book_id,book_name,book_auth from books
 open @bookCursor;
go
--调用book_cursor存储过程
declare @cur cursor,
 @bookID int,
 @bookName varchar(20),
 @bookAuth varchar(20);
exec book_cursor @bookCursor=@cur output;
fetch next from @cur into @bookID,@bookName,@bookAuth;
while(@@FETCH_STATUS=0)
begin 
 fetch next from @cur into @bookID,@bookName,@bookAuth;
 print 'bookID:'+convert(varchar,@bookID)+' , bookName: '+ @bookName
 +' ,bookAuth: '+@bookAuth;
end
close @cur --关闭游标
DEALLOCATE @cur; --释放游标
Nach dem Login kopieren

if (object_id('book_page', 'P') is not null)
 drop proc book_page
go
create proc book_page(
 @TableName varchar(50), --表名
 @ReFieldsStr varchar(200) = '*', --字段名(全部字段为*)
 @OrderString varchar(200), --排序字段(必须!支持多字段不用加order by)
 @WhereString varchar(500) =N'', --条件语句(不用加where)
 @PageSize int, --每页多少条记录
 @PageIndex int = 1 , --指定当前为第几页
 @TotalRecord int output --返回总记录数
)
as
begin
 --处理开始点和结束点
 Declare @StartRecord int;
 Declare @EndRecord int; 
 Declare @TotalCountSql nvarchar(500); 
 Declare @SqlString nvarchar(2000); 
 set @StartRecord = (@PageIndex-1)*@PageSize + 1
 set @EndRecord = @StartRecord + @PageSize - 1 
 SET @TotalCountSql= N'select @TotalRecord = count(*) from ' + @TableName;--总记录数语句
 SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查询语句
 --
 IF (@WhereString! = '' or @WhereString!=null)
 BEGIN
 SET @TotalCountSql=@TotalCountSql + ' where '+ @WhereString;
 SET @SqlString =@SqlString+ ' where '+ @WhereString; 
 END
 --第一次执行得到
 --IF(@TotalRecord is null)
 -- BEGIN
 EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output;--返回总记录数
 -- END
 ----执行主语句
 set @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' + ltrim(str(@EndRecord));
 Exec(@SqlString) 
END
--调用分页存储过程book_page
exec book_page 'books','*','book_id','',3,1,0;
--
declare @totalCount int
exec book_page 'books','*','book_id','',3,1,@totalCount output; 
select @totalCount as totalCount;--总记录数。
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage