ALTER PROCEDURE (Transact-SQL)

CREATE PROCEDURE ステートメントを使用して作成した既存のプロシージャを変更します。 ALTER PROCEDURE では権限は変更されず、従属ストアド プロシージャまたはトリガーに影響することはありませんが、 QUOTED_IDENTIFIER と ANSI_NULLS の現在のセッション設定は、変更時にストアド プロシージャに取り込まれます。 ストアド プロシージャの最初の作成時に有効であった設定と変更後の設定が異なる場合、ストアド プロシージャの動作が変わる可能性があります。

トピック リンク アイコンTransact-SQL 構文表記規則 (Transact-SQL)

構文

--Transact-SQL Stored Procedure Syntax
ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ] 
    [ { @parameter [ type_schema_name. ] data_type } 
        [ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]
    ] [ ,...n ] 
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ] 
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]

<procedure_option> ::= 
    [ ENCRYPTION ]
    [ RECOMPILE ]
    [ EXECUTE AS Clause ]

--CLR Stored Procedure Syntax
ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ] 
    [ { @parameter [ type_schema_name. ] data_type } 
        [ = default ] [ OUT | OUTPUT ] [READONLY]
    ] [ ,...n ] 
[ WITH EXECUTE AS Clause ]
AS { EXTERNAL NAME assembly_name.class_name.method_name }
[;]

引数

  • schema_name
    プロシージャが属するスキーマの名前を指定します。

  • procedure_name
    変更するプロシージャの名前を指定します。 プロシージャ名は、識別子の規則に従っている必要があります。

  • **;**number
    同じ名前のプロシージャをグループ化するために使用する既存の整数を指定します (省略可能)。グループ化されたプロシージャは、DROP PROCEDURE ステートメントを使用して一度に削除できます。

    注意注意

    この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。 新しい開発作業では、この機能の使用を避け、現在この機能を使用しているアプリケーションは修正するようにしてください。

  • **@**parameter
    プロシージャ内のパラメーターを指定します。 パラメーターは 2,100 個まで指定できます。

  • [ type_schema_name**.** ] data_type
    パラメーターのデータ型とそれが属するスキーマを指定します。

    データ型の制約については、「CREATE PROCEDURE (Transact-SQL)」を参照してください。

  • VARYING
    出力パラメーターとしてサポートされている結果セットを指定します。 このパラメーターはストアド プロシージャによって動的に作成され、その内容は変化します。 カーソル パラメーターにのみ適用されます。

  • default
    パラメーターの既定値です。

  • OUT | OUTPUT
    パラメーターが戻りパラメーターであることを示します。

  • READONLY
    パラメーターをプロシージャの本体内で更新または変更できないことを示します。 パラメーターの型がテーブル値型の場合は、READONLY を指定する必要があります。

  • RECOMPILE
    SQL Server 2005 データベース エンジンでは、このプロシージャ用のプランをキャッシュせず、実行時にプロシージャを再コンパイルします。

  • ENCRYPTION
    データベース エンジンで、ALTER PROCEDURE ステートメントの元のテキストを、暗号化した形式に変換することを示します。 暗号化した形式の出力は、SQL Server 2005 内のどのカタログ ビューでも直接見ることはできません。 システム テーブルまたはデータベース ファイルへのアクセス権を持たないユーザーは、暗号化した形式のテキストを取得できません。 DAC ポート経由でシステム テーブルにアクセスする権限、または直接データベース ファイルにアクセスする権限を持っているユーザーは、このテキストを使用できます。 また、サーバー プロセスにデバッガーをアタッチできるユーザーは、実行時、元のプロシージャをメモリから取得できます。 システム メタデータへのアクセスの詳細については、「メタデータ表示の構成」を参照してください。

    このオプションを使って作成したプロシージャを、SQL Server レプリケーションの一部として発行することはできません。

    このオプションは、共通言語ランタイム (CLR) のストアド プロシージャには指定できません。

    注意注意

    データベース エンジンでは、アップグレード中に、sys.sql_modules に格納されている暗号化コメントにより、プロシージャが再作成されます。

  • EXECUTE AS
    アクセス後にストアド プロシージャを実行するセキュリティ コンテキストを指定します。

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

  • FOR REPLICATION
    レプリケーション用に作成したストアド プロシージャは、サブスクライバーでは実行できないことを示します。 FOR REPLICATION オプションを指定して作成したストアド プロシージャは、ストアド プロシージャ フィルターとして使用され、レプリケーション時にのみ実行されます。 FOR REPLICATION を指定した場合、パラメーターは宣言できません。 RECOMPILE オプションは、FOR REPLICATION を使って作成されたプロシージャでは無視されます。

  • AS
    プロシージャが行う動作です。

  • <sql_statement>
    プロシージャに含まれる任意の数と種類の Transact-SQL ステートメントを指定します。 いくつかの制約があります。 詳細については、「CREATE PROCEDURE (Transact-SQL)」の「<sql_statement> の制限」を参照してください。

  • EXTERNAL NAME assembly_name**.class_name.method_name
    CLR ストアド プロシージャで参照する Microsoft.NET Framework アセンブリのメソッドを指定します。class_name は有効な SQL Server 識別子で、アセンブリ内にクラスとして存在する必要があります。 クラス名に名前空間とその区切り文字のピリオド (
    .) が含まれる場合は、クラス名をかっこ ([]) または引用符 (""**) で区切る必要があります。 指定するメソッドは、クラスの静的メソッドであることが必要です。

    注意注意

    既定では、SQL Server で CLR コードを実行することはできません。 CLR モジュールを参照するデータベース オブジェクトを作成、変更、削除することはできませんが、これらの参照を SQL Server で実行するには、clr enabled option を有効にする必要があります。 このオプションを有効にするには、sp_configure を使用します。

説明

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

詳細については、「CREATE PROCEDURE (Transact-SQL)」の「解説」を参照してください。

注意注意

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

権限

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

次の例では、uspVendorAllInfo ストアド プロシージャを作成します。 このプロシージャは、Adventure Works Cycles を提供するすべてのベンダーの名前と、そのベンダーの提供製品、信用格付け、およびベンダーが現時点で製品を提供できるかどうかを返します。 このプロシージャを作成した後、別の結果セットを返すようプロシージャを変更します。

USE AdventureWorks;
GO
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 'Credit Rating', 
      v.ActiveFlag AS Availability
    FROM Purchasing.Vendor v 
    INNER JOIN Purchasing.ProductVendor pv
      ON v.VendorID = pv.VendorID 
    INNER JOIN Production.Product p
      ON pv.ProductID = p.ProductID 
    ORDER BY v.Name ASC;
GO

次の例では、uspVendorAllInfo ストアド プロシージャを変更し (EXECUTE AS オプションなし)、指定した製品を供給するベンダーだけを返します。 ここでは、LEFT 関数および CASE 関数を使用して、結果セットの表示をカスタマイズします。

ALTER PROCEDURE Purchasing.uspVendorAllInfo
    @Product varchar(25) 
AS
    SELECT LEFT(v.Name, 25) AS Vendor, LEFT(p.Name, 25) AS 'Product name', 
    'Credit 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.VendorID = pv.VendorID 
    INNER JOIN Production.Product AS p 
      ON pv.ProductID = p.ProductID 
    WHERE p.Name LIKE @Product
    ORDER BY v.Name ASC;
GO
EXEC Purchasing.uspVendorAllInfo N'LL Crankarm';
GO

以下に結果セットを示します。

Vendor               Product name        Credit rating Availability
-------------------- ------------------- ------------- ------------
Proseware, Inc.      LL Crankarm         Average       No
Vision Cycles, Inc.  LL Crankarm         Superior      Yes

(2 row(s) affected)

関連項目

タスク

参照

概念

その他の技術情報