Sök…


Introduktion

I SQL Server är en procedur ett lagrat program som du kan skicka parametrar till. Det ger inte ett värde som en funktion gör. Men det kan returnera en framgång / misslyckad status till proceduren som kallade det.

Syntax

  • SKAPA {FÖRFARANDE | PROC} [schema_name.] Procedurnamn
  • [@parameter [typ_schema_name.] datatype
  • [VARYING] [= standard] [OUT | UTGÅNG | LÄGENHET]
  • , @parameter [typ_schema_name.] datatype
  • [VARYING] [= standard] [OUT | UTGÅNG | LÄGENHET]]
  • [MED {ENCRYPTION | REKOMPIL | EXECUTE AS Clause}]
  • [FÖR FÖRSLAG]
  • SOM
  • BÖRJA
  • [Declaration_section]
  • executable_section
  • SLUTET;

Skapa och genomföra en grundläggande lagrad procedur

Använda tabellen Authors i bibliotekets databas

CREATE PROCEDURE GetName
(
    @input_id INT = NULL,      --Input parameter,  id of the person, NULL default
    @name VARCHAR(128) = NULL  --Input parameter, name of the person, NULL default
) 
AS
BEGIN 
    SELECT Name + ' is from ' + Country 
    FROM Authors 
    WHERE Id = @input_id OR Name = @name
END 
GO

Du kan utföra en procedur med några olika syntaxer. Först kan du använda EXECUTE eller EXEC

EXECUTE GetName @id = 1
EXEC Getname @name = 'Ernest Hemingway'

Dessutom kan du utelämna EXEC-kommandot. Du behöver inte heller ange vilken parameter du skickar in när du skickar in alla parametrar.

GetName NULL, 'Ernest Hemingway'

När du vill ange ingångsparametrarna i en annan ordning än hur de deklareras i proceduren kan du ange parameternamn och tilldela värden. Till exempel

 CREATE PROCEDURE dbo.sProcTemp 
 (
    @Param1 INT,
    @Param2 INT
)
AS
BEGIN

    SELECT
        Param1 = @Param1,
        Param2 = @Param2

END

den normala ordningen för att utföra denna procedur är att ange värdet för @ Param1 först och sedan @ Param2 sekund. Så det kommer att se ut så här

  EXEC dbo.sProcTemp @Param1 = 0,@Param2=1

Men det är också möjligt att du kan använda följande

  EXEC dbo.sProcTemp @Param2 = 0,@Param1=1

i detta anger du värdet för @ param2 först och @ Param1 sekund. Vilket innebär att du inte behöver behålla samma ordning som den förklaras i proceduren men du kan ha vilken beställning du vill. men du måste ange vilken parameter du ställer in värdet

Få åtkomst till lagrad procedur från vilken databas som helst

Och du kan också skapa en procedur med ett prefix sp_ dessa upphandlade, liksom alla systemlagrade procedurer, kan köras utan att ange databasen på grund av standardbeteendet för SQL Server. När du kör en lagrad procedur som börjar med "sp_" letar SQL Server först efter proceduren i huvuddatabasen. Om proceduren inte finns i master ser den ut i den aktiva databasen. Om du har en lagrad procedur som du vill komma åt från alla dina databaser, skapar du den i master och använder ett namn som innehåller prefixet "sp_".

Use Master

CREATE PROCEDURE sp_GetName
(
    @input_id INT = NULL,      --Input parameter,  id of the person, NULL default
    @name VARCHAR(128) = NULL  --Input parameter, name of the person, NULL default
) 
AS
BEGIN 
    SELECT Name + ' is from ' + Country 
    FROM Authors 
    WHERE Id = @input_id OR Name = @name
END 
GO

LAGRAD FÖRFARANDE med OUT-parametrar

Lagrade procedurer kan returnera värden med hjälp av OUTPUT nyckelordet i sin parameterlista.

Skapa en lagrad procedur med en enstaka parameter

CREATE PROCEDURE SprocWithOutParams
(
    @InParam VARCHAR(30),
    @OutParam VARCHAR(30) OUTPUT
)
AS
BEGIN
    SELECT @OutParam = @InParam + ' must come out'   
    RETURN
END   
GO

Utför den lagrade proceduren

DECLARE @OutParam VARCHAR(30)    
EXECUTE SprocWithOutParams 'what goes in', @OutParam OUTPUT   
PRINT @OutParam 

Skapa en lagrad procedur med flera utparametrar

CREATE PROCEDURE SprocWithOutParams2
(
    @InParam VARCHAR(30),
    @OutParam VARCHAR(30) OUTPUT,
    @OutParam2 VARCHAR(30) OUTPUT
)
AS
BEGIN
    SELECT @OutParam = @InParam +' must come out'   
    SELECT @OutParam2 = @InParam +' must come out'
    RETURN
END    
GO

Utför den lagrade proceduren

DECLARE @OutParam VARCHAR(30)    
DECLARE @OutParam2 VARCHAR(30)  
EXECUTE SprocWithOutParams2 'what goes in', @OutParam OUTPUT, @OutParam2 OUTPUT   
PRINT @OutParam 
PRINT @OutParam2

Lagrad procedur med If ... Annars och sätt in i drift

Skapa exempel tabell Employee :

CREATE TABLE Employee
(
    Id INT,
    EmpName VARCHAR(25),
    EmpGender VARCHAR(6),
    EmpDeptId INT
)

Skapar lagrad procedur som kontrollerar om värdena som sparats i lagrad procedur inte är noll eller icke tomma och utför insatsoperation i medarbetartabellen.

CREATE PROCEDURE spSetEmployeeDetails
(
    @ID int,
    @Name VARCHAR(25),
    @Gender VARCHAR(6),
    @DeptId INT
)
AS
BEGIN
    IF (
        (@ID IS NOT NULL AND LEN(@ID) !=0) 
        AND (@Name IS NOT NULL AND LEN(@Name) !=0)
        AND (@Gender IS NOT NULL AND LEN(@Gender) !=0)
        AND (@DeptId IS NOT NULL AND LEN(@DeptId) !=0)
    )
    BEGIN
        INSERT INTO Employee
        (
            Id,
            EmpName,
            EmpGender,
            EmpDeptId
        )
        VALUES
        (
            @ID,
            @Name,
            @Gender,
            @DeptId
        )
    END
ELSE
    PRINT 'Incorrect Parameters'
END
GO

Utför den lagrade proceduren

DECLARE @ID INT,
    @Name VARCHAR(25),
    @Gender VARCHAR(6),
    @DeptId INT

EXECUTE spSetEmployeeDetails
    @ID = 1,
    @Name = 'Subin Nepal',
    @Gender = 'Male',
    @DeptId = 182666 

Dynamisk SQL i lagrad procedur

Dynamisk SQL gör det möjligt för oss att generera och köra SQL-satser vid körning. Dynamisk SQL behövs när våra SQL-uttalanden innehåller identifierare som kan ändras vid olika sammanställningstider.

Enkelt exempel på dynamisk SQL:

CREATE PROC sp_dynamicSQL
@table_name      NVARCHAR(20),
@col_name        NVARCHAR(20), 
@col_value       NVARCHAR(20) 
AS
BEGIN
DECLARE  @Query  NVARCHAR(max)
SET      @Query = 'SELECT * FROM ' + @table_name
SET      @Query = @Query + ' WHERE ' + @col_name + ' = ' + ''''+@col_value+''''
EXEC     (@Query)
END

I ovanstående sqlfråga kan vi se att vi kan använda frågan ovan genom att definiera värden i @table_name, @col_name, and @col_value vid körning. Frågan genereras vid körning och körs. Detta är en teknik där vi kan skapa hela skript som sträng i en variabel och köra det. Vi kan skapa mer komplexa frågor med hjälp av dynamiskt SQL- och sammankopplingskoncept. Det här konceptet är mycket kraftfullt när du vill skapa ett skript som kan användas under flera förhållanden.

Utför lagrad procedur

DECLARE @table_name     NVARCHAR(20) = 'ITCompanyInNepal',
        @col_name       NVARCHAR(20) = 'Headquarter',
        @col_value      NVARCHAR(20) = 'USA'
    
EXEC    sp_dynamicSQL   @table_name,    
                        @col_name,
                        @col_value

Tabell jag har använt

ange bildbeskrivning här

Produktion

ange bildbeskrivning här

Enkel loopning

Låt #systables först få lite data i en temptabell med namnet #systables och #systables ett ökande radnummer så att vi kan fråga en post åt gången

select
    o.name,
    row_number() over (order by o.name) as rn
into
    #systables
from
    sys.objects as o
where
    o.type = 'S'

Därefter förklarar vi några variabler för att kontrollera loopingen och lagra tabellnamnet i det här exemplet

declare
    @rn int = 1,
    @maxRn int = (
                    select
                        max(rn)
                    from
                        #systables as s
                    )
declare    @tablename sys name

Nu kan vi slinga med ett enkelt tag. Vi ökar @rn i det select uttalandet men det kan också ha varit ett separat uttalande för ex set @rn = @rn + 1 det kommer att bero på dina krav. Vi använder också värdet på @rn innan det ökas för att välja en enda post från #systables . Slutligen skriver vi ut tabellnamnet.

while @rn <= @maxRn
    begin

        select
            @tablename = name,
            @rn = @rn + 1
        from
            #systables as s
        where
            s.rn = @rn

        print @tablename
    end

Enkel loopning

CREATE PROCEDURE SprocWithSimpleLoop
(
    @SayThis VARCHAR(30),
    @ThisManyTimes INT
)
AS
BEGIN
    WHILE @ThisManyTimes > 0
    BEGIN
        PRINT @SayThis;
        SET @ThisManyTimes = @ThisManyTimes - 1;
    END
    
    RETURN;
END    
GO


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow