ストアド プロシージャの実行
このトピックでは、SQL Server Management Studio または Transact-SQL を使用して、SQL Server 2012 でストアド プロシージャを実行する方法について説明します。
ストアド プロシージャを実行するには、2 つの方法があります。 1 つ目の最も一般的な方法は、アプリケーションまたはユーザーがプロシージャを呼び出す方法です。 2 番目の方法は、SQL Server のインスタンスの起動時にプロシージャが自動的に実行されるように設定する方法です。 アプリケーションまたはユーザーによってプロシージャが呼び出される場合は、Transact-SQL の EXECUTE または EXEC キーワードが呼び出しの中に明示的に指定されています。 または、プロシージャが Transact-SQL バッチ内の最初のステートメントである場合は、このキーワードを使用せずにストアド プロシージャを呼び出すことができます。
このトピックの内容
作業を開始する準備:
制限事項と制約事項
推奨事項
セキュリティ
ストアド プロシージャを実行するために使用するもの:
SQL Server Management Studio
Transact-SQL
作業を開始する準備
制限事項と制約事項
システム プロシージャ名を照合するときに、呼び出し元のデータベースの照合順序が使用されます。 そのため、プロシージャの呼び出しでは、システム プロシージャ名の大文字と小文字を常に区別する必要があります。 たとえば、次のコードは、大文字と小文字を区別する照合順序が指定されたデータベースのコンテキストで実行された場合は失敗します。
```Transact-SQL EXEC SP_heLP; -- Will fail to resolve because SP_heLP does not equal sp_help ```
正確なシステム ストアド プロシージャ名を表示するには、sys.system_objects カタログ ビューおよび sys.system_parameters カタログ ビューをクエリします。
システム プロシージャと同じ名前を持つユーザー定義プロシージャは、実行されない可能性があります。
推奨事項
システム ストアド プロシージャの実行
システム ストアド プロシージャは、sp_ というプレフィックスで始まります。 システム ストアド プロシージャは、論理的にすべてのユーザー定義データベースおよびシステム定義データベースに表示されるため、プロシージャ名を完全修飾する必要なく、任意のデータベースから実行できます。 ただし、名前の競合を回避するためには、すべてのシステム プロシージャ名を sys スキーマ名でスキーマ修飾することをお勧めします。 次の例は、システム ストアド プロシージャの呼び出しに関して推奨されている方法を示しています。
```Transact-SQL EXEC sys.sp_who; ```
ユーザー定義のストアド プロシージャの実行
ユーザー定義のプロシージャを実行する場合は、プロシージャ名をスキーマ名で修飾することをお勧めします。 これにより、データベース エンジンが複数のスキーマに対して検索を実行する必要がなくなるため、パフォーマンスが多少向上します。 また、複数のスキーマに同じ名前のプロシージャがあるデータベースで誤ったプロシージャが実行されることを防止できます。
次の例は、ユーザー定義のプロシージャを実行するために推奨されている方法を示しています。 このプロシージャは 1 つの入力パラメーターを受け取ります。 入力パラメーターと出力パラメーターを指定する方法の詳細については、「パラメーターの指定」を参照してください。
```Transact-SQL USE AdventureWorks2012; GO EXEC dbo.uspGetEmployeeManagers @BusinessEntityID = 50; ```
または
```Transact-SQL EXEC AdventureWorks2012.dbo.uspGetEmployeeManagers 50; GO ```
修飾されていないユーザー定義のプロシージャを指定した場合、データベース エンジンでは次の順序でプロシージャが検索されます。
現在のデータベースの sys スキーマ。
バッチまたは動的 SQL で実行された場合は、呼び出し側の既定のスキーマ。 または、別のプロシージャ定義の本文の中に非修飾型プロシージャ名がある場合は、そのプロシージャを含んでいるスキーマが次に検索されます。
現在のデータベースの dbo スキーマ。
ストアド プロシージャの自動実行
自動実行用にマークされたプロシージャは、SQL Server を起動するたびに実行されます。スタートアップ プロセス中に、master データベースが復旧されます。 データベースのメンテナンス操作を実行する場合や、バックグラウンド プロセスとしてプロシージャを連続実行する場合は、自動実行するようにプロシージャを設定すると便利です。 プロシージャの自動実行は、グローバル一時テーブルの作成など、tempdb のシステム タスクまたはメンテナンス タスクを行う場合にも使用できます。 このようにすると、SQL Server のスタートアップ時に tempdb が再作成されても、一時テーブルの存在が保証されます。
自動実行されるプロシージャは、固定サーバー ロール sysadmin と同じ権限で操作を行います。 これらのプロシージャが生成するエラー メッセージは、SQL Server のエラー ログに書き込まれます。
スタートアップ プロシージャの数に制限はありませんが、実行中、プロシージャ 1 つにつき 1 つのワーカー スレッドが使用されます。 スタートアップ時に複数のプロシージャを実行する場合でも、並列に実行する必要がないときは 1 つのプロシージャをスタートアップ プロシージャとし、そのプロシージャが残りのプロシージャを呼び出すようにします。 この場合は、全体で 1 つのワーカー スレッドしか使用されません。
ヒント 自動実行されるプロシージャからは、結果セットを返さないでください。 自動実行されるプロシージャは、アプリケーションやユーザーではなく SQL Server が実行するので、結果セットを返す先がないためです。
自動実行の設定、解除、および制御
自動実行されるようにプロシージャを設定できるのは、システム管理者 (sa) だけです。 また、このプロシージャは、master データベースに格納されていて、sa により所有されている必要があり、入出力パラメーターを受け渡すことはできません。
次の操作を実行するには、sp_procoption を使用します。
既存のプロシージャをスタートアップ プロシージャとして指定する。
SQL Server のスタートアップ時にプロシージャが実行されないようにする。
セキュリティ
詳細については、「EXECUTE AS (Transact-SQL)」および「EXECUTE AS 句 (Transact-SQL)」を参照してください。
権限
詳細については、「EXECUTE (Transact-SQL)」の「権限」を参照してください。
[先頭に戻る]
SQL Server Management Studio の使用
ストアド プロシージャを実行するには
オブジェクト エクスプローラーで、SQL Server データベース エンジンのインスタンスに接続して、そのインスタンスを展開します。次に、[データベース] を展開します。
目的のデータベースを展開し、[プログラミング] を展開します。次に、[ストアド プロシージャ] を展開します。
目的のユーザー定義のストアド プロシージャを右クリックし、[ストアド プロシージャの実行] をクリックします。
[プロシージャの実行] ダイアログ ボックスで、各パラメーターの値と、null 値を渡すかどうかを指定します。
[パラメーター]
パラメーターの名前を示します。[データ型]
パラメーターのデータ型を示します。[出力パラメーター]
これが出力パラメーターかどうかを示します。[NULL 値を渡す]
パラメーターの値として NULL を渡します。値
プロシージャを呼び出すときのパラメーターの値を入力します。
ストアド プロシージャを実行するには、[OK] をクリックします。
[先頭に戻る]
Transact-SQL の使用
ストアド プロシージャを実行するには
データベース エンジンに接続します。
[標準] ツール バーの [新しいクエリ] をクリックします。
次の例をコピーしてクエリ ウィンドウに貼り付け、[実行] をクリックします。 この例は、1 つのパラメーターを受け取るストアド プロシージャを実行する方法を示します。 この例では、@EmployeeID パラメーター値として値 6 を指定して、uspGetEmployeeManagers ストアド プロシージャを実行します。
```Transact-SQL
USE AdventureWorks2012;
GO
EXEC dbo.uspGetEmployeeManagers 6;
GO
```
プロシージャの自動実行を設定または解除するには
データベース エンジンに接続します。
[標準] ツール バーの [新しいクエリ] をクリックします。
次の例をコピーしてクエリ ウィンドウに貼り付け、[実行] をクリックします。 この例は、sp_procoption を使用してプロシージャの自動実行を設定する方法を示しています。
```Transact-SQL
USE AdventureWorks2012;
GO
EXEC sp_procoption @ProcName = '<procedure name>'
, @OptionName = ] 'startup'
, @OptionValue = 'on';
```
プロシージャの自動実行を解除するには
データベース エンジンに接続します。
[標準] ツール バーの [新しいクエリ] をクリックします。
次の例をコピーしてクエリ ウィンドウに貼り付け、[実行] をクリックします。 この例は、sp_procoption を使用して、プロシージャの自動実行を解除する方法を示しています。
```Transact-SQL
USE AdventureWorks2012;
GO
EXEC sp_procoption @ProcName = '<procedure name>'
, @OptionValue = 'off';
```
例 (Transact-SQL)
[先頭に戻る]
関連項目
参照
CREATE PROCEDURE (Transact-SQL)