ストアド プロシージャの実行
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
この記事では、SQL Server のストアド プロシージャを、SQL Server Management Studio または Transact-SQL を使用して実行する方法について説明します。
ストアド プロシージャを実行する際の別の方法もあります。 1 つ目の最も一般的な方法は、アプリケーションまたはユーザーがプロシージャを呼び出す方法です。 もう一つの方法とは、 SQL Server のインスタンスのスタートアップ時に、ストアド プロシージャが自動的に実行されるように設定することです。
アプリケーションまたはユーザーによってプロシージャが呼び出される場合、Transact-SQL の EXECUTE または EXEC キーワードが呼び出しの中に明示的に指定されています。 プロシージャが Transact-SQL バッチ内の最初のステートメントである場合、EXEC キーワードを使用せずにそのプロシージャを呼び出して、実行することができます。
制限事項と制約事項
システム プロシージャ名を照合するときに、呼び出し元のデータベースの照合順序が使用されます。 この理由により、プロシージャの呼び出しでは、システム プロシージャ名の大文字と小文字を常に区別する必要があります。 たとえば、次のコードは、大文字と小文字を区別する照合順序が指定されたデータベースのコンテキストで実行された場合に失敗します。
EXEC SP_heLP; -- Fails to resolve because SP_heLP doesn't equal sp_help
正確なシステム ストアド プロシージャ名を表示するには、 sys.system_objects カタログ ビューおよび sys.system_parameters カタログ ビューをクエリします。
システム プロシージャと同じ名前を持つユーザー定義プロシージャは、実行されない可能性があります。
推奨事項
ストアド プロシージャを実行する際に、以下の推奨事項を使用してください。
システム ストアド プロシージャ
システム プロシージャは、sp_
というプレフィックスで始まります。 システム プロシージャは,論理的にすべてのユーザー定義データベースおよびシステム定義データベースに表示されるため、プロシージャ名を完全修飾する必要なく、任意のデータベースから実行できます。 ただし、名前の競合を回避するには、すべてのシステム プロシージャ名を sys
スキーマ名でスキーマ修飾することをお勧めします。 次の例は、システム ストアド プロシージャの呼び出しに関して推奨されている方法を示しています。
EXEC sys.sp_who;
ユーザー定義ストアド プロシージャ。
ユーザー定義のプロシージャを実行する場合は、プロシージャ名をスキーマ名で修飾することをお勧めします。 これにより、データベース エンジンが複数のスキーマに対して検索を実行する必要がなくなるため、パフォーマンスが多少向上します。 また、スキーマ名を使用すると、複数のスキーマに同じ名前のプロシージャがあるデータベースで誤ったプロシージャが実行されることを防止できます。
次の例は、ユーザー定義のプロシージャを実行するために推奨されている方法を示しています。 このプロシージャは 2 つの入力パラメーターを受け取ります。 入力パラメーターと出力パラメーターを指定する方法の詳細については、「 ストアド プロシージャ内のパラメーターの指定」を参照してください。
EXECUTE SalesLT.uspGetCustomerCompany @LastName = N'Cannon', @FirstName = N'Chris';
GO
または:
EXEC SalesLT.uspGetCustomerCompany N'Cannon', N'Chris';
GO
修飾されていないユーザー定義のプロシージャを指定した場合、データベース エンジンでは次の順序でプロシージャが検索されます。
現在のデータベースの
sys
スキーマ。プロシージャがバッチまたは動的 SQL 内で実行された場合は、呼び出し側の既定のスキーマ。 別のプロシージャ定義の本文の中に非修飾型プロシージャ名がある場合は、そのプロシージャを含んでいるスキーマが次に検索されます。
現在のデータベースの
dbo
スキーマ。
セキュリティ
セキュリティ情報については、「EXECUTE AS (Transact-SQL)」および「EXECUTE AS 句 (Transact-SQL)」を参照してください。
アクセス許可
権限情報については、「 実行中のアクセス許可 (Permissions in EXECUTE (Transact-SQL)) 」を参照してください。
ストアド プロシージャの実行
SQL Server Management Studio (SSMS) ユーザー インターフェイス、または Transact-SQL を SSMS クエリ ウィンドウ内で使用することでストアド プロシージャを実行することができます。 常に SSMS の最新のバージョンを使用します。
SQL Server Management Studio を使用します。
オブジェクト エクスプローラーで、SQL Server または Azure SQL データベースのインスタンスに接続し、インスタンスを展開した後、データベースを展開します。
目的のデータベースを展開し、 [プログラミング]を展開します。次に、 [ストアド プロシージャ]を展開します。
実行するストアド プロシージャを右クリックし、[ストアド プロシージャの実行] を選択します。
[プロシージャの実行] ダイアログ ボックスで、パラメーターは各パラメーターの名前を示し、データ型はそのデータ型を示し、出力パラメーターは出力パラメーターかどうかを示します。
各パラメーターの場合:
- [値] に、パラメーターに使用する値を入力します。
- [NULL 値を渡す] は、パラメーターの値として NULL を渡すかどうかを選択します。
ストアド プロシージャを実行するには、[OK] を選択します。 ストアド プロシージャにパラメーターがない場合は、[OK] を選択します。
ストアド プロシージャが実行され、[結果] ペインに結果が表示されます。
たとえば、ストアド プロシージャの作成に関する記事から
SalesLT.uspGetCustomerCompany
ストアド プロシージャを実行するには、@LastName パラメーターに「Cannon」、@FirstName パラメーターに「Chris」と入力し、[OK] を選択します。 この手順により、FirstName
Chris、LastName
Cannon、およびCompanyName
アウトドア スポーツ商品が返されます。
クエリ ウィンドウ内で Transact-SQL を使用する
SSMS では、SQL Server または Azure SQL データベースのインスタンスに接続します。
ツール バーで [新しいクエリ] を選択します。
クエリ ウィンドウに次の構文を含む EXECUTE ステートメントを入力し、必要なすべてのパラメーターの値を指定します。
EXECUTE <ProcedureName> N'<Parameter 1 value>, N'<Parameter x value>; GO
たとえば、次の Transact-SQL ステートメントは、
uspGetCustomerCompany
ストアド プロシージャを実行し、Cannon
を@LastName
パラメーター値として、Chris
を@FirstName
パラメーター値として実行します。EXEC SalesLT.uspGetCustomerCompany N'Cannon', N'Chris'; GO
ツール バーで [実行] を選択します。 ストアド プロシージャを実行します。
パラメーター値のオプション
ストアド プロシージャの EXECUTE ステートメントでパラメーターと値を指定する方法は複数あります。 次の例は、EXECUTE ステートメントのいくつかの異なるオプションを示しています。
パラメーター値をストアド プロシージャで定義されている順序と同じ順序で指定する場合は、パラメーター名を示す必要はありません。 次に例を示します。
EXEC SalesLT.uspGetCustomerCompany N'Cannon', N'Chris';
@parameter_name=value
パターンでパラメーター名を指定する場合は、パラメーター名と値を定義と同じ順序で指定する必要はありません。 たとえば、次のどちらのステートメントも有効です。EXEC SalesLT.uspGetCustomerCompany @FirstName = N'Chris', @LastName = N'Cannon';
または
EXEC SalesLT.uspGetCustomerCompany @LastName = N'Cannon', @FirstName = N'Chris';
任意のパラメーターに
@parameter_name=value
フォームを使用する場合は、そのステートメント内の後続のすべてのパラメーターにフォームを使用する必要があります。 たとえば、EXEC SalesLT.uspGetCustomerCompany1 @FirstName = N'Chris', N'Cannon';
は使用できません。
スタートアップ時の自動実行
適用対象: SQL Server
SQL Server 内で、sysadmin
サーバー ロールのメンバーは、sp_procoption を使用して、スタートアップ時に自動実行のプロシージャを設定または解除できます。 スタートアップ プロシージャは、master
データベースに存在する必要があり、sa
によって所有されている必要があり、また、入出力パラメーターを含めることはできません。 詳細については、「sp_procoption (Transact-SQL)」を参照してください。
自動実行用にマークされたプロシージャは、SQL Server がスタートアップするたびに実行され、そのスタートアップ プロセス中に master
データベースが復旧されます。 データベースのメンテナンス操作を実行する場合や、バックグラウンド プロセスとしてプロシージャを連続実行する場合は、自動実行するようにプロシージャを設定すると便利です。
プロシージャの自動実行は、グローバル一時テーブルの作成など、tempdb
のシステム タスクまたはメンテナンス タスクを行う場合にも使用できます。 自動実行により、SQL Server のスタートアップ時に tempdb
が再作成される場合に、このような一時テーブルが常に存在することを確保できます。
自動的に実行されるプロシージャは、sysadmin
固定サーバー ロールのメンバーと同じ権限で操作を行います。 これらのプロシージャが生成するエラー メッセージは SQL Server ログに書き込みます。
スタートアップ プロシージャの数に制限はありませんが、実行中、スタートアッププロシージャ 1 つにつき 1 つのワーカー スレッドが使用されます。 スタートアップ時に複数のプロシージャを実行する場合でも、並列に実行する必要がないときは 1 つのプロシージャをスタートアップ プロシージャとし、そのプロシージャに他のプロシージャを呼び出させます。 このメソッドでは、全体で 1 つのワーカー スレッドしか使用されません。
ヒント
自動実行されるプロシージャからは、結果セットを返さないでください。 プロシージャは、アプリケーションやユーザーではなく SQL Server によって実行されるため、結果セットを返す先がないことが原因です。
Note
Azure SQL Database は、 master
データベースへの依存から機能を分離するように設計されています。 したがって、サーバー レベルのオプションを構成する Transact-SQL ステートメントを Azure SQL 内で使用することができません。 エラスティック ジョブ や Azure Automation などの他の Azure サービス内で適切な代替候補が見つかる場合がよくあります。
スタートアップ時に自動実行するプロシージャを設定する
自動実行されるようにプロシージャを設定できるのは、システム管理者 (sa
) のみです。
SSMS 内で、データベース エンジンに接続します。
標準ツール バーから、 [新しいクエリ] を選択します。
次の sp_procoption コマンドを入力して、SQL Server のスタートアップ時に自動実行するストアド プロシージャを設定します。
EXEC sp_procoption @ProcName = N'<stored procedure name>' , @OptionName = 'startup' , @OptionValue = 'on'; GO
ツール バーの [実行] を選択します。
プロシージャのスタートアップ時の自動実行の解除
sysadmin
は、sp_procoption を使用して、SQL Server のスタートアップ時のプロシージャの自動実行を停止することができます。
SSMS 内で、データベース エンジンに接続します。
標準ツール バーから、 [新しいクエリ] を選択します。
クエリ ウィンドウに、次のコマンドを入力します。
EXEC sp_procoption @ProcName = N'<stored procedure name>' , @OptionName = 'startup' , @OptionValue = 'off'; GO
ツール バーの [実行] を選択します。