Delen via


ALTER PROCEDURE (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric

Wijzigt een eerder gemaakte procedure die is gemaakt door de CREATE PROCEDURE-instructie in SQL Server uit te voeren.

Transact-SQL Syntaxisconventies (Transact-SQL)

Syntaxis

-- 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
De naam van het schema waartoe de procedure behoort.

procedure_name
De naam van de procedure om te veranderen. Procedurenamen moeten voldoen aan de regels voor identificatoren.

;getal
Een bestaand optioneel geheel getal dat wordt gebruikt om procedures met dezelfde naam te groeperen zodat ze samen kunnen worden verwijderd met één DROP PROCEDURE-instructie.

Opmerking

Deze functie wordt verwijderd in een toekomstige versie van SQL Server. Vermijd het gebruik van deze functie in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die momenteel gebruikmaken van deze functie.

@ parameter_name
Een parameter in de procedure. Er kunnen tot 2.100 parameters worden gespecificeerd.

[ type_schema_name. ] data_type
Is het datatype van de parameter en het schema waartoe deze behoort.

Voor informatie over beperkingen van gegevenstype, zie CREATE PROCEDURE (Transact-SQL).

WISSELEND
Hiermee geeft u de resultatenset die wordt ondersteund als uitvoerparameter. Deze parameter wordt dynamisch geconstrueerd door de opgeslagen procedure en de inhoud ervan kan variëren. Geldt alleen voor cursorparameters. Deze optie is niet geldig voor CLR-procedures.

standaard
Is een standaardwaarde voor de parameter.

OUT | UITVOER
Geeft aan dat de parameter een retourparameter is.

READONLY
Geeft aan dat de parameter niet binnen de procedure kan worden bijgewerkt of gewijzigd. Als het parametertype een tabelwaardetype is, moet READONLY worden opgegeven.

RECOMPILE
Geeft aan dat de Database Engine geen plan voor deze procedure cachet en dat de procedure tijdens uitvoering opnieuw wordt gecompileerd.

CODERING
Van toepassing op: SQL Server (SQL Server 2008 (10.0.x) en later) en Azure SQL Database.

Geeft aan dat de Database Engine de oorspronkelijke tekst van de ALTER PROCEDURE-instructie zal omzetten naar een verborgen formaat. De output van de obfuscatie is niet direct zichtbaar in een van de catalogusweergaven in SQL Server. Gebruikers die geen toegang hebben tot systeemtabellen of databasebestanden kunnen de verborgen tekst niet ophalen. De tekst zal echter beschikbaar zijn voor privilegede gebruikers die ofwel systeemtabellen kunnen benaderen via de DAC-poort of direct databasebestanden. Ook kunnen gebruikers die een debugger aan het serverproces kunnen koppelen, de oorspronkelijke procedure tijdens runtime uit het geheugen ophalen. Zie De configuratie van zichtbaarheid van metagegevens van metagegevens voor metagegevens voor meer informatie over het openen van systeemmetagegevens.

Procedures die met deze optie zijn gemaakt, kunnen niet worden gepubliceerd als onderdeel van SQL Server-replicatie.

Deze optie kan niet worden gespecificeerd voor common language runtime (CLR) opgeslagen procedures.

Opmerking

Tijdens een upgrade gebruikt de Database Engine de verborgen opmerkingen die in sys.sql_modules zijn opgeslagen om procedures opnieuw te creëren.

UITVOEREN ALS
Specificeert de beveiligingscontext waaronder de opgeslagen procedure moet worden uitgevoerd nadat deze is geraadpleegd.

Zie EXECUTE AS-component (Transact-SQL) voor meer informatie.

VOOR REPLICATIE

Specificeert dat opgeslagen procedures die voor replicatie zijn gemaakt, niet op de abonnee kunnen worden uitgevoerd. Een opgeslagen procedure die is gemaakt met de optie VOOR REPLICATIE wordt gebruikt als een stored procedure-filter en wordt alleen uitgevoerd tijdens replicatie. Parameters kunnen niet worden gedeclareerd als VOOR REPLICATIE is gespecificeerd. Deze optie is niet geldig voor CLR-procedures. De optie RECOMPILE wordt genegeerd voor procedures die zijn gemaakt met FOR REPLICATION.

Opmerking

Deze optie is niet beschikbaar in een besloten database.

{ [ BEGIN ] sql_statement [;] [ ... n ] [ END ] }
Een of meer Transact-SQL verklaringen die de hoofdtekst van de procedure omvatten. U kunt de optionele begin- en eindtrefwoorden gebruiken om de instructies in te sluiten. Voor meer informatie, zie de secties Best Practices, Algemene Opmerkingen en Beperkingen en Beperkingen in CREATE PROCEDURE (Transact-SQL).

EXTERNE NAAM assembly_name.class_name.method_name
van toepassing op: SQL Server 2008 (10.0.x) en hoger.

Specificeert de methode van een .NET Framework-assembly voor een CLR-opgeslagen procedure om naar te verwijzen. class_name moet een geldige SQL Server-id zijn en moeten bestaan als een klasse in de assembly. Als de klasse een naamruimte-gekwalificeerde naam heeft die een punt (.) gebruikt om naamruimtedelen te scheiden, moet de klassenaam worden afgebakend met haakjes ([]) of aanhalingstekens (""). De opgegeven methode moet een statische methode van de klasse zijn.

Standaard kan SQL Server geen CLR-code uitvoeren. Je kunt databaseobjecten aanmaken, aanpassen en verwijderen die verwijzen naar runtime-modules in een gangbare taal; je kunt deze referenties echter niet uitvoeren in SQL Server totdat je de CLR-ingeschakelde optie hebt ingeschakeld. Als u de optie wilt inschakelen, gebruikt u sp_configure.

Opmerking

CLR-procedures worden niet ondersteund in een ingesloten database.

Algemene opmerkingen

Transact-SQL opgeslagen procedures kunnen niet worden gewijzigd in CLR-opgeslagen procedures en omgekeerd.

ALTER PROCEDURE verandert geen rechten en beïnvloedt geen afhankelijke opgeslagen procedures of triggers. De huidige sessie-instellingen voor QUOTED_IDENTIFIER en ANSI_NULLS zijn echter opgenomen in de opgeslagen procedure wanneer deze wordt gewijzigd. Als de instellingen verschillen van die welke golden toen de opgeslagen procedure oorspronkelijk werd aangemaakt, kan het gedrag van de opgeslagen procedure veranderen.

Als een eerdere proceduredefinitie is gemaakt met WITH ENCRYPTION of WITH RECOMPILE, zijn deze opties alleen ingeschakeld als ze zijn opgenomen in ALTER PROCEDURE.

Voor meer informatie over opgeslagen procedures, zie CREATE PROCEDURE (Transact-SQL).

Security

Permissions

Vereist ALTER-toestemming voor de procedure of lidmaatschap van de db_ddladmin vaste databaserol.

Voorbeelden

Het volgende voorbeeld creëert de uspVendorAllInfo opgeslagen procedure. Deze procedure geeft de namen van alle leveranciers die Adventure Works Cycles aanbieden, de producten die zij leveren, hun kredietwaardigheid en hun beschikbaarheid terug. Nadat deze procedure is gemaakt, wordt deze aangepast om een andere resultaatset terug te geven.

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    

Het volgende voorbeeld verandert de uspVendorAllInfo opgeslagen procedure. Het verwijdert de clausule EXECUTE AS CALLER en wijzigt de procedure zo dat alleen die leveranciers worden teruggegeven die het gespecificeerde product leveren. De functies LEFT en CASE passen het uiterlijk van de resultatenset aan.

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  

Hier is het resultatenoverzicht.

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

Zie ook

PROCEDURE MAKEN (Transact-SQL)
DROPPROCEDURE (Transact-SQL)
UITVOEREN (Transact-SQL)
UITVOER ALS (Transact-SQL)
EVENTDATA (Transact-SQL)
Opgeslagen Procedures (Database Engine)
sys.procedures (Transact-SQL)