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

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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  

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

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

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

  3. 現在のデータベースの 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 を使用する

  1. オブジェクト エクスプローラーで、SQL Server または Azure SQL データベースのインスタンスに接続し、インスタンスを展開した後、データベースを展開します。

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

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

  4. [プロシージャの実行] ダイアログ ボックスで、パラメーターは各パラメーターの名前を示し、データ型はそのデータ型を示し、出力パラメーターは出力パラメーターかどうかを示します。

    各パラメーターの場合:

    • [値] に、パラメーターに使用する値を入力します。
    • [NULL 値を渡す] は、パラメーターの値として NULL を渡すかどうかを選択します。
  5. ストアド プロシージャを実行するには、[OK] を選択します。 ストアド プロシージャにパラメーターがない場合は、[OK] を選択します。

    ストアド プロシージャが実行され、[結果] ペインに結果が表示されます。

    たとえば、ストアド プロシージャの作成に関する記事から SalesLT.uspGetCustomerCompany ストアド プロシージャを実行するには、@LastName パラメーターに「Cannon」、@FirstName パラメーターに「Chris」と入力し、[OK] を選択します。 この手順により、FirstNameChrisLastNameCannon、およびCompanyNameアウトドア スポーツ商品が返されます。

クエリ ウィンドウ内で Transact-SQL を使用する

  1. SSMS では、SQL Server または Azure SQL データベースのインスタンスに接続します。

  2. ツール バーで [新しいクエリ] を選択します。

  3. クエリ ウィンドウに次の構文を含む 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  
    
  4. ツール バーで [実行] を選択します。 ストアド プロシージャを実行します。

パラメーター値のオプション

ストアド プロシージャの 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) のみです。

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

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

  3. 次の sp_procoption コマンドを入力して、SQL Server のスタートアップ時に自動実行するストアド プロシージャを設定します。

    EXEC sp_procoption @ProcName = N'<stored procedure name>'   
        , @OptionName = 'startup'   
        , @OptionValue = 'on';
    GO
    
  4. ツール バーの [実行] を選択します。

プロシージャのスタートアップ時の自動実行の解除

sysadmin は、sp_procoption を使用して、SQL Server のスタートアップ時のプロシージャの自動実行を停止することができます。

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

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

  3. クエリ ウィンドウに、次のコマンドを入力します。

    EXEC sp_procoption @ProcName = N'<stored procedure name>'      
        , @OptionName = 'startup'
        , @OptionValue = 'off';
    GO
    
  4. ツール バーの [実行] を選択します。