回答:
ストアドプロシージャは、いくつかの方法で実行できるSQLステートメントのバッチです。ほとんどの主要なDBMはストアドプロシージャをサポートしています。ただし、すべてがそうするわけではありません。詳細については、特定のDBMSヘルプドキュメントで確認する必要があります。私はSQL Serverに最も慣れているので、それをサンプルとして使用します。
ストアドプロシージャを作成するための構文はかなり単純です。
CREATE PROCEDURE <owner>.<procedure name>
<Param> <datatype>
AS
<Body>
だから例えば:
CREATE PROCEDURE Users_GetUserInfo
@login nvarchar(30)=null
AS
SELECT * from [Users]
WHERE ISNULL(@login,login)=login
ストアドプロシージャの利点は、データアクセスロジックを単一の場所に集中化できるため、DBAが簡単に最適化できることです。ストアドプロシージャには、ストアドプロシージャへの実行権限を付与できるというセキュリティ上の利点もありますが、ユーザーは基になるテーブルに対する読み取り/書き込み権限を持つ必要はありません。これは、SQLインジェクションに対する優れた最初のステップです。
ストアドプロシージャには欠点があります。基本的に、基本的なCRUDに関連するメンテナンスです。操作に。各テーブルについて、挿入、更新、削除、および主キーに基づく少なくとも1つの選択があるとします。つまり、各テーブルには4つのプロシージャがあります。400テーブルのまともなサイズのデータベースを取得すると、1600のプロシージャが作成されます。そして、それはあなたがおそらくそうするであろう重複がないことを前提としています。
これは、基本的なCRUD操作を自動生成するためにORMまたはその他の方法を使用することで、非常に多くのメリットが得られる場合です。
ストアドプロシージャは、特別なタスクを実行するために使用されるプリコンパイルされたSQLステートメントのセットです。
例:Employee
テーブルがある場合
Employee ID Name Age Mobile
---------------------------------------
001 Sidheswar 25 9938885469
002 Pritish 32 9178542436
まず、Employee
テーブルを取得しています。
Create Procedure Employee details
As
Begin
Select * from Employee
End
SQL Serverでプロシージャを実行するには:
Execute Employee details
--- (Employee details is a user defined name, give a name as you want)
次に、従業員テーブルに値を挿入します
Create Procedure employee_insert
(@EmployeeID int, @Name Varchar(30), @Age int, @Mobile int)
As
Begin
Insert Into Employee
Values (@EmployeeID, @Name, @Age, @Mobile)
End
SQL Serverでパラメーター化されたプロシージャを実行するには:
Execute employee_insert 003,’xyz’,27,1234567890
--(Parameter size must be same as declared column size)
例: @Name Varchar(30)
でEmployee
、テーブルName
の列のサイズがなければなりませんvarchar(30)
。
ストアード・プロシージャーは、作成されてデータベースに保管されたSQLステートメントのグループです。ストアドプロシージャは入力パラメータを受け入れるため、さまざまな入力データを使用する複数のクライアントがネットワーク経由で単一のプロシージャを使用できます。ストアドプロシージャは、ネットワークトラフィックを減らし、パフォーマンスを向上させます。ストアドプロシージャを変更すると、すべてのクライアントが更新されたストアドプロシージャを取得します。
ストアドプロシージャを作成するサンプル
CREATE PROCEDURE test_display
AS
SELECT FirstName, LastName
FROM tb_test;
EXEC test_display;
ストアドプロシージャを使用する利点
ストアドプロシージャでは、モジュール式プログラミングが可能です。
プロシージャを一度作成してデータベースに格納し、プログラムで何度でも呼び出すことができます。
ストアドプロシージャを使用すると、実行を高速化できます。
操作で繰り返し実行される大量のSQLコードが必要な場合は、ストアード・プロシージャーをより高速にすることができます。これらは最初に実行されるときに解析および最適化され、ストアドプロシージャのコンパイル済みバージョンは、後で使用するためにメモリキャッシュに残ります。つまり、ストアドプロシージャを使用するたびに再解析および再最適化する必要がないため、実行時間が大幅に短縮されます。
ストアドプロシージャは、ネットワークトラフィックを減らすことができます。
数百行のTransact-SQLコードを必要とする操作は、ネットワーク経由で数百行のコードを送信するのではなく、プロシージャでコードを実行する単一のステートメントによって実行できます。
ストアドプロシージャにより、データのセキュリティが向上します
ユーザーには、プロシージャのステートメントを直接実行する権限がない場合でも、ストアドプロシージャを実行する権限を付与できます。
SQL Serverには、さまざまな種類のストアドプロシージャがあります。
システムストアドプロシージャはmasterデータベースに格納され、これらはsp_
プレフィックスで始まります。これらの手順を使用して、システムテーブル内の外部アプリケーション呼び出しのSQL Server関数をサポートするさまざまなタスクを実行できます。
例:sp_helptext [StoredProcedure_Name]
ユーザー定義のストアドプロシージャは通常、ユーザーデータベースに格納され、通常、ユーザーデータベースのタスクを完了するように設計されています。これらの手順のコーディングでは、sp_
プレフィックスを使用しません。sp_
プレフィックスを最初に使用すると、マスターデータベースがチェックされ、次にユーザー定義のデータベースが使用されるためです。
拡張ストアドプロシージャは、DLLファイルから関数を呼び出すプロシージャです。現在、拡張ストアドプロシージャの使用は避けた方がよいという理由で、拡張ストアドプロシージャは推奨されていません。
通常、ストアドプロシージャは「SQL関数」です。彼らは持っている:
-- a name
CREATE PROCEDURE spGetPerson
-- parameters
CREATE PROCEDURE spGetPerson(@PersonID int)
-- a body
CREATE PROCEDURE spGetPerson(@PersonID int)
AS
SELECT FirstName, LastName ....
FROM People
WHERE PersonID = @PersonID
これはT-SQLに焦点を当てた例です。ストアドプロシージャは、ほとんどのSQLステートメントを実行し、スカラーおよびテーブルベースの値を返すことができ、SQLインジェクション攻撃を防ぐため、より安全であると考えられています。
このような状況を考えて、
注意:
ストアドプロシージャは、単一の実行プランにコンパイルされたSQLステートメントのグループにすぎません。
例:ストアドプロシージャの作成
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetEmployee
@EmployeeID int = 0
AS
BEGIN
SET NOCOUNT ON;
SELECT FirstName, LastName, BirthDate, City, Country
FROM Employees
WHERE EmployeeID = @EmployeeID
END
GO
ストアドプロシージャを変更または変更します。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE GetEmployee
@EmployeeID int = 0
AS
BEGIN
SET NOCOUNT ON;
SELECT FirstName, LastName, BirthDate, City, Country
FROM Employees
WHERE EmployeeID = @EmployeeID
END
GO
ストアドプロシージャを削除または削除します。
DROP PROCEDURE GetEmployee
「ストアドプロシージャとは」は、他の投稿で既に回答されています。私が投稿するのは、ストアドプロシージャを使用する1つのあまり知られていない方法です。それはありますgrouping stored procedures
かnumbering stored procedures
。
構文リファレンス
; number
これに従って
同じ名前のプロシージャをグループ化するために使用されるオプションの整数。これらのグループ化されたプロシージャは、1つのDROP PROCEDUREステートメントを使用して一緒に削除できます。
例
CREATE Procedure FirstTest
(
@InputA INT
)
AS
BEGIN
SELECT 'A' + CONVERT(VARCHAR(10),@InputA)
END
GO
CREATE Procedure FirstTest;2
(
@InputA INT,
@InputB INT
)
AS
BEGIN
SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO
使用する
exec FirstTest 10
exec FirstTest;2 20,30
結果
別の試み
CREATE Procedure SecondTest;2
(
@InputA INT,
@InputB INT
)
AS
BEGIN
SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO
結果
メッセージ2730、レベル11、状態1、プロシージャSecondTest、行1 [バッチ開始行3]同じ名前とグループ番号1のプロシージャが現在存在しないため、グループ番号2のプロシージャ 'SecondTest'を作成できませんデータベース。最初にCREATE PROCEDURE 'SecondTest'; 1を実行する必要があります。
参照:
注意
ストアドプロシージャは、SQLステートメントと手続きロジックの名前付きコレクションです。つまり、コンパイルされ、検証され、サーバーデータベースに格納されます。ストアドプロシージャは通常、他のデータベースオブジェクトと同様に扱われ、サーバーのセキュリティメカニズムを通じて制御されます。
SQL Serverのストアドプロシージャは、入力パラメーターを受け入れ、出力パラメーターの複数の値を返すことができます。SQL Serverでは、データベースで操作を実行し、呼び出し元のプロシージャまたはバッチにステータス値を返すストアドプロシージャプログラムステートメント。
SQL Serverでストアドプロシージャを使用する利点
それらはモジュラープログラミングを可能にします。彼らはより速い実行を可能にします。ネットワークトラフィックを減らすことができます。セキュリティメカニズムとして使用できます。
パラメータを受け取り、クエリを実行して結果を返すストアドプロシージャの例を次に示します。具体的には、ストアード・プロシージャーはBusinessEntityIDをパラメーターとして受け入れ、これを使用してHumanResources.Employeeテーブルの主キーを突き合わせて、要求された従業員を返します。
> create procedure HumanResources.uspFindEmployee `*<<<---Store procedure name`*
@businessEntityID `<<<----parameter`
as
begin
SET NOCOUNT ON;
Select businessEntityId, <<<----select statement to return one employee row
NationalIdNumber,
LoginID,
JobTitle,
HireData,
From HumanResources.Employee
where businessEntityId =@businessEntityId <<<---parameter used as criteria
end
これはエッセンシャル・ドット・コムから学びました。とても便利です。
ストアドプロシージャでは、ステートメントは1回だけ記述され、クライアントとサーバー間のネットワークトラフィックを減らします。SQLインジェクション攻撃を回避することもできます。
ORM
好きなストアドプロシージャですか?Entity Framework
CRUD