共用方式為


ALTER PROCEDURE (Transact-SQL)

更新: 2005 年 12 月 5 日

修改先前執行 CREATE PROCEDURE 陳述式所建立的程序。ALTER PROCEDURE 不會變更權限,也不會影響任何相依的預存程序或觸發程序。不過,當修改預存程序時,會將 QUOTED_IDENTIFIER 和 ANSI_NULLS 的目前工作階段設定併入預存程序中。如果這些設定不同於最初建立預存程序時的有效設定,便有可能改變預存程序的行為。

主題連結圖示Transact-SQL 語法慣例

語法

ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] 
     [ { @parameter [ type_schema_name. ] data_type } 
    [ VARYING ] [ = default ] [ [ OUT [ PUT ] 
    ] [ ,...n ] 
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ] 
AS 
     { <sql_statement> [ ...n ] | <method_specifier> }

<procedure_option> ::= 
    [ ENCRYPTION ]
    [ RECOMPILE ]
    [ EXECUTE_AS_Clause ]

<sql_statement> ::= 
{ [ BEGIN ] statements [ END ] }

<method_specifier> ::=
EXTERNAL NAME 
assembly_name.class_name.method_name

引數

  • schema_name
    這是程序所屬的結構描述名稱。
  • procedure_name
    這是要變更的程序名稱。程序名稱必須符合識別碼的規則。
  • **;**number
    這是現有的選擇性整數,用來分組名稱相同的程序,以便能夠利用單一 DROP PROCEDURE 陳述式來同時卸除它們。

    ms189762.note(zh-tw,SQL.90).gif附註:
    未來的 Microsoft SQL Server 發行版本將不再提供此功能。請避免在新的開發工作中使用此功能,並計劃修改目前使用此功能的應用程式。
  • **@**parameter
    這是程序中的參數。您最多可以指定 2,100 個參數。
  • [ type_schema_name**.** ] data_type
    這是參數的資料類型及其所屬的結構描述。

    如需有關資料類型限制的資訊,請參閱<CREATE PROCEDURE (Transact-SQL)>。

  • VARYING
    指定支援作為輸出參數的結果集。這個參數是預存程序所動態建構的,可能會有不同的內容。只適用於 cursor 參數。
  • default
    這是參數的預設值。
  • OUTPUT
    指出參數是一個傳回參數。
  • RECOMPILE
    指出 SQL Server 2005 Database Engine 不會快取這個程序的計劃,而執行階段會重新編譯程序。
  • ENCRYPTION
    指出 Database Engine 會將 ALTER PROCEDURE 陳述式的原始文字轉換為混亂格式。在 SQL Server 2005 中,無法直接從任何目錄檢視中看見混亂格式的輸出。對系統資料表或資料庫檔案沒有存取權的使用者,無法擷取混亂格式的文字。不過,可以透過 DAC 通訊埠存取系統資料表,或直接存取資料庫檔案的特許使用者,則可使用該文字。另外,可將偵錯工具附加至伺服器處理序的使用者,可以在執行階段從記憶體擷取原始程序。如需有關存取系統中繼資料的詳細資訊,請參閱<中繼資料可見性組態>。

    使用這個選項建立的程序,不能發行為 SQL Server 複寫的一部分。

    Common Language Runtime (CLR) 預存程序不能指定這個選項。

    ms189762.note(zh-tw,SQL.90).gif附註:
    在升級期間,Database Engine 會利用 sys.sql_modules 所儲存的混亂格式註解來重新建立程序。
  • EXECUTE AS
    指定在存取預存程序之後,用來執行預存程序的安全性內容。

    如需詳細資訊,請參閱<EXECUTE AS 子句 (Transact-SQL)>。

  • FOR REPLICATION
    指定無法在訂閱者執行為了複寫而建立的預存程序。利用 FOR REPLICATION 選項來建立的預存程序,用來作為預存程序篩選,只有在複寫期間才會執行它。如果指定了 FOR REPLICATION,就不能宣告參數。利用 FOR REPLICATION 來建立的程序,會忽略 RECOMPILE 選項。
  • 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 識別碼,且必須作為類別存在於組件中。如果該類別的名稱符合命名空間規定,且該名稱利用句點 (
    .) 來分隔命名空間的各個部分,您就必須使用方括號 ([]) 或引號 (""**) 來分隔類別名稱。指定的方法必須是類別的靜態方法。

    ms189762.note(zh-tw,SQL.90).gif附註:
    依預設,SQL Server 不能執行 CLR 程式碼。您可以建立、修改和卸除參考 Common Language Runtime 模組的資料庫物件;不過,在啟用 clr enabled 選項之前,您無法在 SQL Server 中執行這些參考。若要啟用這個選項,請使用 sp_configure

備註

Transact-SQL 預存程序無法修改成 CLR 預存程序,反之亦然。

如需詳細資訊,請參閱<CREATE PROCEDURE (Transact-SQL)>中的「備註」一節。

ms189762.note(zh-tw,SQL.90).gif附註:
如果先前的程序定義是利用 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 選項),使其只傳回提供指定產品的供應商。LEFTCASE 函數可自訂結果集的外觀。

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)

請參閱

參考

CREATE PROCEDURE (Transact-SQL)
流程控制語言 (Transact-SQL)
資料類型 (Transact-SQL)
DECLARE @local\_variable (Transact-SQL)
DROP PROCEDURE (Transact-SQL)
EXECUTE (Transact-SQL)
EXECUTE AS (Transact-SQL)
EVENTDATA (Transact-SQL)
函數 (Transact-SQL)
sp_depends (Transact-SQL)
sp_procoption (Transact-SQL)
sp_recompile (Transact-SQL)
sys.sql_modules (Transact-SQL)
sys.parameters (Transact-SQL)
sys.procedures (Transact-SQL)
sys.sql_dependencies (Transact-SQL)
sys.assembly_modules (Transact-SQL)
sys.numbered_procedures (Transact-SQL)
sys.numbered_procedure_parameters (Transact-SQL)
OBJECT_DEFINITION (Transact-SQL)

其他資源

批次
資料指標 (Database Engine)
預存程序 (Database Engine)
使用變數和參數 (Database Engine)
對發行集資料庫進行結構描述變更
如何:修改預存程序 (SQL Server Management Studio)

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2005 年 12 月 5 日

變更的內容:
  • 釐清 ENCRYPTION 選項的定義。