ストアド プロシージャの実行

適用対象: はいSQL Server (サポートされているすべてのバージョン) はいAzure SQL データベース はいAzure SQL Managed Instance はいAzure Synapse Analytics はいParallel Data Warehouse

この記事では、SQL Server のストアド プロシージャを、SQL Server Management Studio または Transact-SQL を使用して実行する方法について説明します。

ストアド プロシージャを実行するには、2 つの方法があります。 1 つ目の最も一般的な方法は、アプリケーションまたはユーザーがプロシージャを呼び出す方法です。 2 番目の方法は、 SQL Server のインスタンスの起動時にプロシージャが自動的に実行されるように設定する方法です。 アプリケーションまたはユーザーによってプロシージャが呼び出される場合は、 Transact-SQL の EXECUTE または EXEC キーワードが呼び出しの中に明示的に指定されています。 プロシージャが Transact-SQL バッチ内の最初のステートメントである場合は、EXEC キーワードを使用せずにストアド プロシージャを呼び出すことができます。

はじめる前に

制限事項と制約事項

システム プロシージャ名を照合するときに、呼び出し元のデータベースの照合順序が使用されます。 この理由により、プロシージャの呼び出しでは、システム プロシージャ名の大文字と小文字を常に区別する必要があります。 たとえば、次のコードは、大文字と小文字を区別する照合順序が指定されたデータベースのコンテキストで実行された場合に失敗します。

EXEC SP_heLP; -- Will fail to resolve because SP_heLP does not equal sp_help  

正確なシステム ストアド プロシージャ名を表示するには、 sys.system_objects カタログ ビューおよび sys.system_parameters カタログ ビューをクエリします。

システム プロシージャと同じ名前を持つユーザー定義プロシージャは、実行されない可能性があります。

推奨事項

システム ストアド プロシージャの実行

システム プロシージャは、sp_ というプレフィックスで始まります。 それらは論理的にすべてのユーザー定義データベースおよびシステム定義データベースに表示されるため、プロシージャ名を完全修飾する必要なく、任意のデータベースから実行できます。 ただし、名前の競合を回避するには、すべてのシステム プロシージャ名を sys スキーマ名でスキーマ修飾することをお勧めします。 次の例は、システム ストアド プロシージャの呼び出しに関して推奨されている方法を示しています。

EXEC sys.sp_who;  

ユーザー定義のストアド プロシージャの実行

ユーザー定義のプロシージャを実行する場合は、プロシージャ名をスキーマ名で修飾することをお勧めします。 これにより、 データベース エンジン が複数のスキーマに対して検索を実行する必要がなくなるため、パフォーマンスが多少向上します。 また、複数のスキーマに同じ名前のプロシージャがあるデータベースで誤ったプロシージャが実行されることを防止できます。

次の例は、ユーザー定義のプロシージャを実行するために推奨されている方法を示しています。 このプロシージャは 1 つの入力パラメーターを受け取ります。 入力パラメーターと出力パラメーターを指定する方法の詳細については、「 パラメーターの指定」を参照してください。

USE AdventureWorks2019;  
GO  
EXEC dbo.uspGetEmployeeManagers @BusinessEntityID = 50;
GO

または

EXEC AdventureWorks2019.dbo.uspGetEmployeeManagers 50;  
GO  

修飾されていないユーザー定義のプロシージャを指定した場合、 データベース エンジン では次の順序でプロシージャが検索されます。

  1. 現在のデータベースの sys スキーマ。

  2. バッチまたは動的 SQL で実行された場合は、呼び出し側の既定のスキーマ。 または、別のプロシージャ定義の本文の中に非修飾型プロシージャ名がある場合は、そのプロシージャを含んでいるスキーマが次に検索されます。

  3. 現在のデータベースの dbo スキーマ。

ストアド プロシージャの自動実行

自動実行用にマークされたプロシージャは、SQL Server が起動するたびに実行され、そのスタートアップ プロセス中に master データベースが復旧されます。 データベースのメンテナンス操作を実行する場合や、バックグラウンド プロセスとしてプロシージャを連続実行する場合は、自動実行するようにプロシージャを設定すると便利です。 プロシージャの自動実行は、グローバル一時テーブルの作成など、tempdb のシステム タスクまたはメンテナンス タスクを行う場合にも使用できます。 このようにすると、SQL Server のスタートアップ中に tempdb が再作成されても、一時テーブルが確実に存在するようになります。

自動実行されるプロシージャは、固定サーバー ロール sysadmin と同じ権限で操作を行います。 これらのプロシージャが生成するエラー メッセージは、 SQL Server のエラー ログに書き込まれます。

スタートアップ プロシージャの数に制限はありませんが、実行中、プロシージャ 1 つにつき 1 つのワーカー スレッドが使用されます。 スタートアップ時に複数のプロシージャを実行する場合でも、並列に実行する必要がないときは 1 つのプロシージャをスタートアップ プロシージャとし、そのプロシージャが残りのプロシージャを呼び出すようにします。 この場合は、全体で 1 つのワーカー スレッドしか使用されません。

ヒント

自動実行されるプロシージャからは、結果セットを返さないでください。 自動実行されるプロシージャは、アプリケーションやユーザーではなく SQL Server が実行するので、結果セットを返す先がないためです。

自動実行の設定、解除、および制御

自動実行されるようにプロシージャを設定できるのは、システム管理者 (sa) のみです。 また、このプロシージャは、master データベースに格納されて sa によって所有されている必要があり、入出力パラメーターを含めることはできません。

次の操作を実行するには、 sp_procoption を使用します。

  1. 既存のプロシージャをスタートアップ プロシージャとして指定する。

  2. SQL Server のスタートアップ時にプロシージャが実行されないようにする。

セキュリティ

詳細については、「EXECUTE AS (Transact-SQL)」および「EXECUTE AS 句 (Transact-SQL)」を参照してください。

Permissions

詳細については、「 EXECUTE (Transact-SQL)でストアド プロシージャを実行する方法について説明します。

SQL Server Management Studio の使用

ストアド プロシージャの実行

  1. オブジェクト エクスプローラー で、 SQL Server データベース エンジンのインスタンスに接続して、そのインスタンスを展開します。次に、 [データベース] を展開します。

  2. 目的のデータベースを展開し、 [プログラミング] を展開します。次に、 [ストアド プロシージャ] を展開します。

  3. 目的のユーザー定義のストアド プロシージャを右クリックし、 [ストアド プロシージャの実行] を選択します。

  4. [プロシージャの実行] ダイアログ ボックスで、各パラメーターの値と、null 値を渡すかどうかを指定します。

    パラメーター
    パラメーターの名前を示します。

    [データ型]
    パラメーターのデータ型を示します。

    [出力パラメーター]
    これが出力パラメーターかどうかを示します。

    [NULL 値を渡す]
    パラメーターの値として NULL を渡します。

    Value
    プロシージャを呼び出すときのパラメーターの値を入力します。

  5. ストアド プロシージャを実行するには、 [OK] を選択します。

Transact-SQL の使用

ストアド プロシージャの実行

  1. データベース エンジンに接続します。

  2. 標準バーから、 [新しいクエリ] を選択します。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例は、1 つのパラメーターを受け取るストアド プロシージャを実行する方法を示します。 この例では、@EmployeeID パラメーター値として 6 を指定して、uspGetEmployeeManagers ストアド プロシージャを実行します。

USE AdventureWorks2019;  
GO  
EXEC dbo.uspGetEmployeeManagers 6;  
GO  

プロシージャの自動実行の設定または解除

スタートアップ プロシージャは、master データベースに存在する必要があり、入出力パラメーターを含めることはできません。 ストアド プロシージャの実行は、起動時にすべてのデータベースが復旧され、「復旧が完了しました」というメッセージが記録されると開始します。

詳細については、「sp_procoption (Transact-SQL)」を参照してください。

  1. データベース エンジンに接続します。

  2. 標準バーから、 [新しいクエリ] を選択します。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例は、 sp_procoption を使用してプロシージャの自動実行を設定する方法を示しています。

EXEC sp_procoption @ProcName = N'<procedure name>'   
    , @OptionName = 'startup'   
    , @OptionValue = 'on';
GO

プロシージャの自動実行の解除

  1. データベース エンジンに接続します。

  2. 標準バーから、 [新しいクエリ] を選択します。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例は、 sp_procoption を使用して、プロシージャの自動実行を解除する方法を示しています。

EXEC sp_procoption @ProcName = N'<procedure name>'      
    , @OptionName = 'startup'
    , @OptionValue = 'off';
GO

次のステップ