概念
ストアド プロシージャ: 実行可能プロシージャにプリコンパイルされた 1 つ以上の SQL ステートメント。
ストアド プロシージャ構文の作成
CREATE proc | procedure procedure_name [{@参数数据类型} [=默认值] [output], {@参数数据类型} [=默认值] [output], .... ] as SQL_statements go
ストアド プロシージャと SQL ステートメントの比較
利点:
1. パフォーマンスの向上
SQL ステートメントは、プロシージャの作成時に分析およびコンパイルされます。 ストアド プロシージャは、初めて実行されるときにプリコンパイルされ、クエリ オプティマイザーによって分析および最適化され、最終的にシステム テーブルに保存されるストレージ プランが提供されます。これにより、プロシージャの実行時にこのオーバーヘッドが節約されます。 。
2. ネットワーク オーバーヘッドの削減
ストアド プロシージャを呼び出すときは、ストアド プロシージャ名と必要なパラメータ情報を指定するだけで済むため、ネットワーク トラフィックが削減されます。
3. コードの移植を容易にする
データベースの専門家はいつでもストアド プロシージャを変更できますが、アプリケーションのソース コードには影響を与えないため、プログラムの移植性が大幅に向上します。
4. より強力なセキュリティ
1) システム管理者は、権限のないユーザーがデータにアクセスするのを避けるために、実行中の特定のストアドプロセスの権限を制限できます
2) ネットワーク経由でプロセスを呼び出す場合、呼び出された実行プロセスのみが表示されます。 したがって、悪意のあるユーザーはテーブルやデータベースのオブジェクト名を確認したり、独自の Transact-SQL ステートメントを埋め込んだり、重要なデータを検索したりすることができません。
3) プロシージャ パラメーターを使用すると、SQL インジェクション攻撃を回避できます。 パラメーター入力は実行可能コードではなくリテラル値として扱われるため、攻撃者がプロシージャ内の Transact-SQL ステートメントにコマンドを挿入してセキュリティを侵害することがより困難になります。
4) プロセスは暗号化できるため、ソース コードを難読化するのに役立ちます。
短所:
1. ストアド プロシージャの保守には専門のデータベース開発者が必要ですが、実際にはプログラム開発者はパートタイムで作業することが多いです。
2. ストアド プロシージャの設計ロジックの変更や変更は SQL ほど柔軟ではありません。
実際、アプリケーションではストアド プロシージャがあまり使用されないのはなぜですか?
通常のプロジェクト開発では、ストアド プロシージャが使用されることは比較的まれですが、これはなぜでしょうか。
その理由は以下のとおりです: 1) 特定のデータベース開発者が存在せず、一般のプログラマーがパートタイムでデータベース操作を実行します
2) プログラマーは、多くの場合、データベース上で開発する必要がなく、データアクセスを完了するためのプログラムを操作するだけで済みます
3) プロジェクト 要件は頻繁に変更されるため、特にロジックの変更が含まれる場合、SQL ステートメントを変更する方が便利です。
2. 一般的なプロジェクトの場合は、パラメーター化されたコマンドを使用することをお勧めします。メソッド (ストアド プロシージャと SQL ステートメントは妥協の方法です)
3. 要件が高く、複数のデータ ロジックが関与する一部のアルゴリズムでは、ストアド プロシージャを使用することをお勧めします
--查询存储过程 IF OBJECT_ID (N'PROC_SELECT_STUDENTS_COUNT', N'P') IS NOT NULL DROP procedure PROC_SELECT_STUDENTS_COUNT; GO CREATE procedure PROC_SELECT_STUDENTS_COUNT AS SELECT COUNT(ID) FROM Students GO実行ステートメント:
EXEC PROC_SELECT_STUDENTS_COUNT3. ワイルドカード、パラメーター値を割り当てる場合、対応するワイルドカードを追加します
--查询存储过程,根据城市查询总数 IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_CITY_COUNT', N'P') IS NOT NULL DROP procedure PROC_SELECT_STUDENTS_BY_CITY_COUNT; GO CREATE procedure PROC_SELECT_STUDENTS_BY_CITY_COUNT(@city nvarchar(50)) AS SELECT COUNT(ID) FROM Students WHERE City=@city GO実行:
EXEC PROC_SELECT_STUDENTS_BY_CITY_COUNT N'Beijing'4. 出力パラメーターを使用して
--3、查询姓氏为李的学生信息,含通配符 IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_SURNNAME', N'P') IS NOT NULL DROP procedure PROC_SELECT_STUDENTS_BY_SURNNAME; GO CREATE procedure PROC_SELECT_STUDENTS_BY_SURNNAME @surnName nvarchar(20)='李%' --默认值 AS SELECT ID,Name,Age FROM Students WHERE Name like @surnName GO2. ストアド プロシージャを使用して追加、削除、変更します1. 生徒情報を追加
EXEC PROC_SELECT_STUDENTS_BY_SURNNAME EXEC PROC_SELECT_STUDENTS_BY_SURNNAME N'李%' EXEC PROC_SELECT_STUDENTS_BY_SURNNAME N'%李%'実行:
--根据姓名查询的学生信息,返回学生的城市及年龄 IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_NAME', N'P') IS NOT NULL DROP procedure PROC_SELECT_STUDENTS_BY_NAME; GO CREATE procedure PROC_SELECT_STUDENTS_BY_NAME @name nvarchar(50), --输入参数 @city nvarchar(20) out, --输出参数 @age int output --输入输出参数 AS SELECT @city=City,@age=Age FROM Students WHERE Name=@name AND Age=@age GO2. 変更生徒IDに基づいて生徒情報を更新
--执行 declare @name nvarchar(50), @city nvarchar(20), @age int; set @name = N'李明'; set @age = 20; exec PROC_SELECT_STUDENTS_BY_NAME @name,@city out, @age output; select @city, @age;実行:
--1、存储过程:新增学生信息 IF OBJECT_ID (N'PROC_INSERT_STUDENT', N'P') IS NOT NULL DROP procedure PROC_INSERT_STUDENT; GO CREATE procedure PROC_INSERT_STUDENT @id int, @name nvarchar(20), @age int, @city nvarchar(20) AS INSERT INTO Students(ID,Name,Age,City) VALUES(@id,@name,@age,@city) GO3. IDに基づいて生徒記録を削除
EXEC PROC_INSERT_STUDENT 1001,N'张三',19,'ShangHai'実行:
IF OBJECT_ID (N'PROC_UPDATE_STUDENT', N'P') IS NOT NULL DROP procedure PROC_UPDATE_STUDENT; GO CREATE procedure PROC_UPDATE_STUDENT @id int, @name nvarchar(20), @age int, @city nvarchar(20) AS UPDATE Students SET Name=@name,Age=@age,City=@city WHERE ID=@id GOThree、ページングクエリを実装するストアドプロシージャ1. ページングに row_number 関数を使用します
EXEC PROC_UPDATE_STUDENT 1001,N'张思',20,'ShangHai'実行:
--3、存储过程:删除学生信息 IF OBJECT_ID (N'PROC_DELETE_STUDENT_BY_ID', N'P') IS NOT NULL DROP procedure PROC_DELETE_STUDENT_BY_ID; GO CREATE procedure PROC_DELETE_STUDENT_BY_ID @id int AS DELETE FROM Students WHERE ID=@id GO2. 従来のトップページングを使用します
EXEC PROC_DELETE_STUDENT_BY_ID 1001Four 。その他の機能:1. ストアド プロシージャを実行するたびに再コンパイルします
--分页查询 IF OBJECT_ID (N'PROC_SELECT_BY_PAGE', N'P') IS NOT NULL DROP procedure PROC_SELECT_BY_PAGE; GO CREATE procedure PROC_SELECT_BY_PAGE @startIndex int, @endIndex int AS SELECT * FROM (SELECT ID,Name,Age,City,ROW_NUMBER() OVER(ORDER BY ID DESC) AS RowNumber FROM Students) AS Temp WHERE Temp.RowNumber BETWEEN @startIndex AND @endIndex GO
2. ストアド プロシージャを暗号化します
暗号化後、ソース スクリプトを表示および変更することはできません
EXEC PROC_SELECT_BY_PAGE 1,10
実行:
--使用TOP分页 IF OBJECT_ID (N'PROC_SELECT_BY_PAGE_WITH_TOP', N'P') IS NOT NULL DROP procedure PROC_SELECT_BY_PAGE_WITH_TOP; GO CREATE procedure PROC_SELECT_BY_PAGE_WITH_TOP @pageIndex int, @pageSize int AS SELECT TOP(@pageSize) * FROM Students WHERE ID >=(SELECT MAX(ID) FROM (SELECT TOP(@pageSize*(@pageIndex-1) + 1) ID FROM Students ORDER BY ID) AS Temp) GO
効果、スクリプトを作成するためにスクリプトを表示またはエクスポートすることはできません