ストアド プロシージャの変更

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

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

制限事項と制約事項

Transact-SQL ストアド プロシージャを CLR ストアド プロシージャに変更したり、その逆に変更することはできません。

以前のプロシージャ定義が WITH ENCRYPTION または WITH RECOMPILE を使用して作成されている場合、これらのオプションは、ALTER PROCEDURE ステートメントに指定されるときだけ有効になります。

Permissions

プロシージャに対する ALTER PROCEDURE 権限が必要です。

SQL Server Management Studio の使用 [SQL Server]

SQL Server Management Studio でプロシージャを変更するには:

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

  2. [データベース] を展開し、プロシージャが属するデータベースを展開し、 [プログラミング] を展開します。

  3. [ストアド プロシージャ] を展開し、変更するプロシージャを右クリックして、 [変更] を選択します。

  4. ストアド プロシージャのテキストを変更します。

  5. 構文をテストするには、 [クエリ] メニューの [解析] を選択します。

  6. 変更をプロシージャの定義に保存するには、 [クエリ] メニューの [実行] を選択します。

  7. 更新されたプロシージャの定義を Transact-SQL スクリプトとして保存するには、[ファイル] メニューの [名前を付けて保存] を選択します。 ファイル名をそのまま使用するか、または新しい名前に置き換え、 [保存] を選択します。

重要

すべてのユーザー入力を検証します。 ユーザー入力は検証するまで連結しないでください。 検証していないユーザー入力から作成されたコマンドは、絶対に実行しないでください。 詳細については、「SQL インジェクション」を参照してください

Transact-SQL の使用

T-SQL コマンドを使用してプロシージャを変更するには:

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

  2. [データベース] を展開し、プロシージャが属するデータベースを展開します。 または、ツール バーの利用可能なデータベースの一覧からデータベースを選択します。 この例では AdventureWorks2022 データベースを選択します。

  3. [ファイル] メニューで [新しいクエリ] を選択します。

  4. 次の例をコピーし、クエリ エディターに貼り付けます。 この例では、 uspVendorAllInfo データベース内のすべてのベンダーの名前と、そのベンダーの提供製品、信用格付け、およびベンダーが現時点で製品を提供できるかどうかを返す Adventure Works Cycles プロシージャが作成されます。

    IF OBJECT_ID ( 'Purchasing.uspVendorAllInfo', 'P' ) IS NOT NULL   
        DROP PROCEDURE Purchasing.uspVendorAllInfo;  
    GO  
    CREATE PROCEDURE Purchasing.uspVendorAllInfo  
    WITH EXECUTE AS CALLER  
    AS  
        SET NOCOUNT ON;  
        SELECT v.Name AS Vendor, p.Name AS 'Product name',   
          v.CreditRating AS 'Rating',   
          v.ActiveFlag AS Availability  
        FROM Purchasing.Vendor v   
        INNER JOIN Purchasing.ProductVendor pv  
          ON v.BusinessEntityID = pv.BusinessEntityID   
        INNER JOIN Production.Product p  
          ON pv.ProductID = p.ProductID   
        ORDER BY v.Name ASC;  
    GO   
    

    重要

    既存のストアド プロシージャを削除して再作成すると、ストアド プロシージャに明示的に与えられている権限が削除されます。 代わりに ALTER を使用してください。

  5. [ファイル] メニューで [新しいクエリ] を選択します。

  6. 次の例をコピーし、クエリ エディターに貼り付けます。 この例では、 uspVendorAllInfo プロシージャが変更されます。 EXECUTE AS CALLER 句が削除され、指定した製品を供給するベンダーだけを返すようにプロシージャの本体が変更されます。 ここでは、 LEFT 関数および CASE 関数を使用して、結果セットの表示をカスタマイズします。

    ALTER PROCEDURE Purchasing.uspVendorAllInfo  
        @Product varchar(25)   
    AS  
        SET NOCOUNT ON;  
        SELECT LEFT(v.Name, 25) AS Vendor, LEFT(p.Name, 25) AS 'Product name',   
        'Rating' = CASE v.CreditRating   
            WHEN 1 THEN 'Superior'  
            WHEN 2 THEN 'Excellent'  
            WHEN 3 THEN 'Above average'  
            WHEN 4 THEN 'Average'  
            WHEN 5 THEN 'Below average'  
            ELSE 'No rating'  
            END  
        , Availability = CASE v.ActiveFlag  
            WHEN 1 THEN 'Yes'  
            ELSE 'No'  
            END  
        FROM Purchasing.Vendor AS v   
        INNER JOIN Purchasing.ProductVendor AS pv  
          ON v.BusinessEntityID = pv.BusinessEntityID   
        INNER JOIN Production.Product AS p   
          ON pv.ProductID = p.ProductID   
        WHERE p.Name LIKE @Product  
        ORDER BY v.Name ASC;  
    GO  
    
  7. 変更をプロシージャの定義に保存するには、 [クエリ] メニューの [実行] を選択します。

  8. 更新されたプロシージャの定義を Transact-SQL スクリプトとして保存するには、[ファイル] メニューの [名前を付けて保存] を選択します。 ファイル名をそのまま使用するか、または新しい名前に置き換え、 [保存] を選択します。

  9. 変更したストアド プロシージャを実行するには、次の例を実行します。

    EXEC Purchasing.uspVendorAllInfo N'LL Crankarm';  
    GO  
    

次の手順