ALTER PROCEDUR (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Microsoft Fabric

Modifierar en tidigare skapad procedur som skapades genom att köra CREATE PROCEDURE-satsen i SQL Server.

Transact-SQL Syntaxkonventioner (Transact-SQL)

Syntax

-- Syntax for SQL Server and Azure SQL Database
  
ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]   
    [ { @parameter_name [ 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 ]  
-- Syntax for SQL Server CLR Stored Procedure  
  
ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]   
    [ { @parameter_name [ type_schema_name. ] data_type }   
        [ = default ] [ OUT | OUTPUT ] [READONLY]  
    ] [ ,...n ]   
[ WITH EXECUTE AS Clause ]  
AS { EXTERNAL NAME assembly_name.class_name.method_name }  
[;]  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and Microsoft Fabric
  
ALTER { PROC | PROCEDURE } [schema_name.] procedure_name  
    [ { @parameterdata_type } [= ] ] [ ,...n ]  
AS { [ BEGIN ] sql_statement [ ; ] [ ,...n ] [ END ] }  
[;]  

Arguments

schema_name
Namnet på schemat som proceduren tillhör.

procedure_name
Namnet på proceduren som ska ändras. Procedurnamn måste följa reglerna för identifierare.

;nummer
Ett befintligt valfritt heltal som används för att gruppera procedurer med samma namn så att de kan tas bort tillsammans med en DROP PROCEDURE-sats.

Anmärkning

Den här funktionen tas bort i en framtida version av SQL Server. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen.

@ parameter_name
En parameter i proceduren. Upp till 2 100 parametrar kan specificeras.

[ type_schema_name. ] data_type
Är datatypen för parametern och schemat den tillhör.

För information om datatypbegränsningar, se CREATE PROCEDURE (Transact-SQL).

VARIERANDE
Anger den resultatuppsättning som stöds som en utdataparameter. Denna parameter konstrueras dynamiskt av den lagrade proceduren och dess innehåll kan variera. Gäller endast markörparametrar. Detta alternativ gäller inte för CLR-procedurer.

förvalt
Är ett standardvärde för parametern.

UT | UTDATA
Indikerar att parametern är en returparameter.

READONLY
Indikerar att parametern inte kan uppdateras eller modifieras inom procedurens kropp. Om parametertypen är en tabellvärdetyp måste READONLY anges.

RECOMPILE
Indikerar att databasmotorn inte cachar en plan för denna procedur och proceduren kompileras om vid körning.

KRYPTERING
Gäller för: SQL Server (SQL Server 2008 (10.0.x) och senare) och Azure SQL Database.

Indikerar att Database Engine kommer att konvertera originaltexten i ALTER PROCEDURE-satsen till ett obfuskerat format. Utdata från obfuskeringen är inte direkt synlig i någon av katalogvyerna i SQL Server. Användare som inte har tillgång till systemtabeller eller databasfiler kan inte hämta den fördunklade texten. Texten kommer dock att vara tillgänglig för privilegierade användare som antingen kan komma åt systemtabeller via DAC-porten eller direkt komma åt databasfiler. Dessutom kan användare som kan koppla en felsökare till serverprocessen hämta den ursprungliga proceduren från minnet vid körning. Mer information om åtkomst till systemmetadata finns i Konfiguration av metadatasynlighet.

Procedurer skapade med detta alternativ kan inte publiceras som en del av SQL Server-replikering.

Detta alternativ kan inte specificeras för common language runtime (CLR) lagrade procedurer.

Anmärkning

Under en uppgradering använder databasmotorn de fördunklade kommentarerna som lagras i sys.sql_modules för att återskapa procedurer.

KÖR SOM
Specificerar säkerhetskontexten under vilken den lagrade proceduren ska köras efter att den har nåts.

Mer information finns i EXECUTE AS-satsen (Transact-SQL).

FÖR REPLIKERING

Specificerar att lagrade procedurer som skapas för replikering inte kan utföras på prenumeranten. En lagrad procedur skapad med alternativet FÖR REPLIKERING används som ett sparat procedurfilter och körs endast under replikering. Parametrar kan inte deklareras om FÖR REPLIKERING är specificerad. Detta alternativ gäller inte för CLR-procedurer. Alternativet RECOMPILE ignoreras för procedurer som skapats med FOR REPLICATION.

Anmärkning

Detta alternativ finns inte tillgängligt i en innehållen databas.

{ [ BEGIN ] sql_statement [;] [ ... n ] [ END ] }
En eller flera Transact-SQL uttalanden som består av förfarandets brödtext. Du kan använda de valfria nyckelorden BEGIN och END för att omsluta -uttrycken. För mer information, se avsnitten Bästa praxis, allmänna anmärkningar samt begränsningar och begränsningar i SKAPA PROPUDER (Transact-SQL).

EXTERNT NAMN assembly_name.class_name.method_name
gäller för: SQL Server 2008 (10.0.x) och senare.

Specificerar metoden för en .NET Framework-assembler för en CLR-lagrad propud att referera till. class_name måste vara en giltig SQL Server-identifierare och måste finnas som en klass i sammansättningen. Om klassen har ett namnrymdskvalificerat namn som använder en punkt (.) för att separera namnrymdsdelar, måste klassnamnet avgränsas med hakparenteser ([]) eller citattecken ("""). Den angivna metoden måste vara en statisk metod för klassen.

Som standard kan SQL Server inte köra CLR-kod. Du kan skapa, modifiera och släppa databasobjekt som refererar till common language runtime-moduler; du kan dock inte köra dessa referenser i SQL Server förrän du aktiverar CLR-aktiverade alternativet. Om du vill aktivera alternativet använder du sp_configure.

Anmärkning

CLR-procedurer stöds inte i en innesluten databas.

Allmänna kommentarer

Transact-SQL lagrade procedurer kan inte ändras så att de är CLR-lagrade procedurer och vice versa.

ALTER PROCEDURE ändrar inte behörigheter och påverkar inte några beroende lagrade procedurer eller triggers. De aktuella sessionsinställningarna för QUOTED_IDENTIFIER och ANSI_NULLS ingår dock i den lagrade proceduren när den ändras. Om inställningarna skiljer sig från de som gällde när den lagrade proceduren ursprungligen skapades kan beteendet för den lagrade proceduren förändras.

Om en tidigare procedurdefinition skapades med WITH ENCRYPTION eller WITH RECOMPILE, aktiveras dessa alternativ endast om de ingår i ALTER PROCEDURE.

För mer information om lagrade procedurer, se CREATE PROCEDURE (Transact-SQL).

Security

Permissions

Kräver ALTER-behörighet för proceduren eller kräver medlemskap i den db_ddladmin fasta databasrollen.

Examples

Följande exempel skapar den lagrade uspVendorAllInfo proceduren. Denna process returnerar namnen på alla leverantörer som tillhandahåller Adventure Works Cycles, de produkter de levererar, deras kreditvärdighet och deras tillgänglighet. Efter att denna procedur har skapats modifieras den sedan för att returnera en annan resultatuppsättning.

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    

Följande exempel ändrar den lagrade uspVendorAllInfo proceduren. Den tar bort klausulen EXECUTE AS CALLER och ändrar procedurens kropp så att endast de leverantörer som levererar den specificerade produkten. Funktionerna LEFT och CASE anpassar resultatets utseende.

USE AdventureWorks2022;  
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  

Här är resultatet.

Vendor               Product name  Rating    Availability  
-------------------- ------------- -------   ------------  
Proseware, Inc.      LL Crankarm   Average   No  
Vision Cycles, Inc.  LL Crankarm   Superior  Yes  
(2 row(s) affected)`  

Se även

SKAPA PROCEDUR (Transact-SQL)
DROP-procedur (Transact-SQL)
UTFÖR (Transact-SQL)
KÖR SOM (Transact-SQL)
HÄNDELSEDATA (Transact-SQL)
Lagrade Procedurer (Databasmotor)
sys.procedures (Transact-SQL)