ALTER PROCEDURE (Transact-SQL)

SQL Server 2008 R2 で、CREATE PROCEDURE ステートメントを使用して作成した既存のプロシージャを変更します。

トピック リンク アイコン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
    出力パラメーターとしてサポートされている結果セットを指定します。このパラメーターはストアド プロシージャによって動的に作成され、その内容は変化します。カーソル パラメーターにのみ適用されます。このオプションは、CLR プロシージャでは無効です。

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

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

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

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

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

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

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

    注意

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

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

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

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

  • { [ BEGIN ] sql_statement [;] [ ...n ][ END ] }
    プロシージャの本体を構成する 1 つ以上の Transact-SQL ステートメントを指定します。省略可能な BEGIN キーワードと END キーワードを使用して、ステートメントを囲むことができます。詳細については、「CREATE PROCEDURE (Transact-SQL)」の「ベスト プラクティス」、「全般的な解説」、および「制限事項と制約事項」を参照してください。

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

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

全般的な解説

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

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

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

ストアド プロシージャの詳細については、「CREATE PROCEDURE (Transact-SQL)」を参照してください。

セキュリティ

権限

プロシージャに対する ALTER 権限または db_ddladmin 固定データベース ロールのメンバーシップが必要です。

使用例

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

USE AdventureWorks2008R2;
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 '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

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

USE AdventureWorks2008R2;
GO
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
EXEC Purchasing.uspVendorAllInfo N'LL Crankarm';
GO

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

Vendor               Product name  Rating    Availability

-------------------- ------------- -------   ------------

Proseware, Inc.      LL Crankarm   Average   No

Vision Cycles, Inc.  LL Crankarm   Superior  Yes

(2 row(s) affected)

関連項目

タスク

参照

概念

その他の技術情報