Dela via


Utföra en lagrad procedur

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-databas i Microsoft Fabric

Den här artikeln beskriver hur du kör en lagrad procedur i SQL Server med hjälp av SQL Server Management Studio eller Transact-SQL.

Det finns olika sätt att köra en lagrad procedur. Den första och vanligaste metoden är att ett program eller en användare anropar proceduren. En annan metod är att ställa in den lagrade proceduren så att den körs automatiskt när en instans av SQL Server startar.

När en procedur anropas av ett program eller en användare anges nyckelordet Transact-SQL EXECUTE eller EXEC uttryckligen i anropet. Proceduren kan anropas och köras utan exec-nyckelordet om proceduren är den första instruktionen i en Transact-SQL batch.

Begränsningar och restriktioner

Den anropande databassorteringen används vid matchning av systemprocedurnamn. Därför använder du alltid det exakta fallet med systemprocedurnamn i proceduranrop. Den här koden misslyckas till exempel om den körs i kontexten för en databas som har en skiftlägeskänslig sortering:

EXEC SP_heLP; -- Fails to resolve because SP_heLP doesn't equal sp_help  

För att visa de exakta systemprocedurnamnen, fråga katalogvyerna sys.system_objects och sys.system_parameters.

Om en användardefinierad procedur har samma namn som en systemprocedur kanske den användardefinierade proceduren aldrig körs.

Rekommendationer

Använd följande rekommendationer för att köra lagrade procedurer.

System lagrade procedurer

Systemprocedurer börjar med prefixet sp_. Eftersom de visas logiskt i alla användar- och systemdefinierade databaser kan systemprocedurer köras från valfri databas utan att fullständigt kvalificera procedurnamnet. Det är dock bäst att schema-kvalificera alla systemprocedurnamn med schemanamnet sys för att förhindra namnkonflikter. I följande exempel visas den rekommenderade metoden för att anropa en systemprocedur.

EXEC sys.sp_who;  

Användardefinierade lagrade procedurer

När du kör en användardefinierad procedur är det bäst att kvalificera procedurnamnet med schemanamnet. Den här metoden ger en liten prestandaökning eftersom databasmotorn inte behöver söka i flera scheman. Om du använder schemanamnet kan du inte heller köra fel procedur om en databas har procedurer med samma namn i flera scheman.

Följande exempel visar den rekommenderade metoden för att köra en användardefinierad procedur. Den här proceduren accepterar två indataparametrar. Information om hur du anger indata- och utdataparametrar finns i Ange parametrar i en lagrad procedur.

EXECUTE SalesLT.uspGetCustomerCompany @LastName = N'Cannon', @FirstName = N'Chris';
GO

Eller:

EXEC SalesLT.uspGetCustomerCompany N'Cannon', N'Chris';
GO  

Om en icke-kvalificerad användardefinierad procedur anges söker databasmotorn efter proceduren i följande ordning:

  1. Det sys schemat för den aktuella databasen.

  2. Anroparens standardschema om proceduren körs i en batch eller i dynamisk SQL. Om det icke-kvalificerade procedurnamnet visas i brödtexten i en annan procedurdefinition genomsöks det schema som innehåller den andra proceduren härnäst.

  3. Det dbo-schema i den aktuella databasen.

Säkerhet

Säkerhetsinformation finns i EXECUTE AS (Transact-SQL) och EXECUTE AS (Transact-SQL).

Behörigheter

Information om behörigheter finns under Behörigheter i EXECUTE (Transact-SQL).

Körning av lagrad procedur

Du kan använda SQL Server Management Studio (SSMS) användargränssnitt eller Transact-SQL i ett SSMS-frågefönster för att köra en lagrad procedur. Använd alltid den senaste versionen av SSMS.

Använda SQL Server Management Studio

  1. I Object Exploreransluter du till en instans av SQL Server eller Azure SQL Database, expanderar den instansen och expanderar sedan Databaser.

  2. Expandera den databas som du vill använda, expandera Programmabilityoch expandera sedan Lagrade procedurer.

  3. Högerklicka på den lagrade procedur som du vill köra och välj Kör lagrad procedur.

  4. I dialogrutan Kör procedur anger Parameter namnet på varje parameter, datatyp anger dess datatyp och utdataparameter anger om det är en utdataparameter.

    För varje parameter:

    • Under Värdeanger du värdet som ska användas för parametern.
    • Under Skicka nullvärdeväljer du om du vill skicka en NULL som värdet för parametern.
  5. Välj OK för att köra den lagrade proceduren. Om den lagrade proceduren inte har några parametrar väljer du bara OK.

    Den lagrade proceduren körs och resultaten visas i fönstret Resultat.

    Om du till exempel vill köra den SalesLT.uspGetCustomerCompany lagrade proceduren från artikeln Skapa en lagrad procedur anger du Cannon för parametern @LastName och Chris för parametern @FirstName och väljer OK. Proceduren returnerar FirstNameChris, LastNameCannon, och CompanyNameOutdoor Sporting Goods.

Använda Transact-SQL i ett frågefönster

  1. I SSMS ansluter du till en instans av SQL Server eller Azure SQL Database.

  2. I verktygsfältet väljer du Ny fråga.

  3. Ange en EXECUTE-instruktion med följande syntax i frågefönstret och ange värden för alla förväntade parametrar:

    EXECUTE <ProcedureName> N'<Parameter 1 value>, N'<Parameter x value>;  
    GO  
    

    Följande Transact-SQL-instruktion kör till exempel den uspGetCustomerCompany lagrade proceduren och med Cannon som @LastName parametervärde och Chris som @FirstName parametervärde:

    EXEC SalesLT.uspGetCustomerCompany N'Cannon', N'Chris';
    GO  
    
  4. I verktygsfältet väljer du Kör. Den lagrade proceduren körs.

Alternativ för parametervärden

Det finns flera sätt att ange parametrar och värden i execute-instruktioner för lagrad procedur. I följande exempel visas flera olika alternativ för EXECUTE-instruktionen.

  • Om du anger parametervärdena i samma ordning som de definieras i den lagrade proceduren behöver du inte ange parameternamnen. Till exempel:

    EXEC SalesLT.uspGetCustomerCompany N'Cannon', N'Chris';
    
  • Om du anger parameternamn i mönstret @parameter_name=value behöver du inte ange parameternamnen och värdena i samma ordning som de definieras. Något av följande uttryck är till exempel giltigt:

    EXEC SalesLT.uspGetCustomerCompany @FirstName = N'Chris', @LastName = N'Cannon';
    

    eller:

    EXEC SalesLT.uspGetCustomerCompany @LastName = N'Cannon', @FirstName = N'Chris';
    
  • Om du använder formuläret @parameter_name=value för valfri parameter måste du använda det för alla efterföljande parametrar i den instruktionen. Du kan till exempel inte använda EXEC SalesLT.uspGetCustomerCompany1 @FirstName = N'Chris', N'Cannon';.

Automatisk körning vid uppstart

gäller för: SQL Server

I SQL Server kan en medlem av sysadmin-serverrollen använda sp_procoption för att ange eller rensa en procedur för automatisk körning vid start. Startprocedurer måste finnas i master-databasen, måste ägas av saoch kan inte ha indata- eller utdataparametrar. Mer information finns i sp_procoption (Transact-SQL).

Procedurer som har markerats för automatisk körning vid start körs varje gång SQL Server startar och den master databasen återställs under startprocessen. Att konfigurera procedurer som ska köras automatiskt kan vara användbart för att utföra databasunderhållsåtgärder eller för att få procedurer att köras kontinuerligt som bakgrundsprocesser.

En annan användning för automatisk körning är att låta proceduren utföra system- eller underhållsaktiviteter i tempdb, till exempel att skapa en global tillfällig tabell. Automatisk körning säkerställer att en sådan temporär tabell alltid finns när tempdb återskapas under uppstart av SQL Server.

En automatiskt utförd procedur fungerar med samma behörigheter som medlemmar i sysadmin fast serverroll. Eventuella felmeddelanden som genereras av proceduren skriver till SQL Server-felloggen.

Det finns ingen gräns för hur många startprocedurer du kan ha, men varje startprocedur förbrukar en arbetstråd under utförandet. Om du behöver köra flera procedurer vid start men inte behöver köra dem parallellt gör du en procedur till startproceduren och anropar de andra procedurerna. Den här metoden använder bara en arbetstråd.

Tips

Returnera inte några resultatuppsättningar från en procedur som körs automatiskt. Eftersom proceduren körs av SQL Server i stället för ett program eller en användare finns det ingenstans för resultatuppsättningar att ta vägen.

Not

Azure SQL Database är utformat för att isolera funktioner från beroenden i master-databasen. Därför är Transact-SQL instruktioner som konfigurerar alternativ på servernivå inte tillgängliga i Azure SQL. Du kan ofta hitta lämpliga alternativ från andra Azure-tjänster, till exempel elastiska jobb eller Azure Automation.

Ange en procedur som ska köras automatiskt vid start

Endast systemadministratören (sa) kan markera en procedur som ska köras automatiskt.

  1. I SSMS ansluter du till databasmotorn.

  2. I verktygsfältet Standard väljer du Ny fråga.

  3. Ange följande sp_procoption kommandon för att ange en lagrad procedur som ska köras automatiskt vid SQL Server-start.

    EXEC sp_procoption @ProcName = N'<stored procedure name>'   
        , @OptionName = 'startup'   
        , @OptionValue = 'on';
    GO
    
  4. I verktygsfältet väljer du Kör.

Stoppa en procedur från att köras automatiskt vid start

En sysadmin kan använda sp_procoption för att stoppa en procedur från att köras automatiskt vid SQL Server-start.

  1. I SSMS ansluter du till databasmotorn.

  2. I verktygsfältet Standard väljer du Ny fråga.

  3. Ange följande kommandon i frågefönstret.

    EXEC sp_procoption @ProcName = N'<stored procedure name>'      
        , @OptionName = 'startup'
        , @OptionValue = 'off';
    GO
    
  4. I verktygsfältet väljer du Kör.