Suche…


Einführung

In SQL Server ist eine Prozedur ein gespeichertes Programm, an das Sie Parameter übergeben können. Es gibt keinen Wert wie eine Funktion zurück. Es kann jedoch einen Erfolgs- / Fehlerstatus an die Prozedur zurückgeben, die es aufgerufen hat.

Syntax

  • ERSTELLEN {PROCEDURE | PROC} [Schemaname.] Prozedurname
  • [@parameter [Typ_Schema_Name.] Datentyp
  • [VARYING] [= Standard] [OUT | AUSGABE | SCHREIBGESCHÜTZT ]
  • , @parameter [Typ_Schema_Name.] Datentyp
  • [VARYING] [= Standard] [OUT | AUSGABE | SCHREIBGESCHÜTZT ] ]
  • [MIT {ENCRYPTION | RECOMPILE | EXECUTE AS-Klausel}]
  • [ZUR ANTWORTUNG]
  • WIE
  • START
  • [Deklarationsabschnitt]
  • executable_section
  • ENDE;

Erstellen und Ausführen einer einfachen gespeicherten Prozedur

Verwenden der Authors Tabelle in der Bibliotheksdatenbank

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

Sie können eine Prozedur mit einigen unterschiedlichen Syntaxen ausführen. Erstens können Sie EXECUTE oder EXEC

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

Darüber hinaus können Sie den Befehl EXEC weglassen. Sie müssen auch nicht angeben, welchen Parameter Sie übergeben, da Sie alle Parameter übergeben.

GetName NULL, 'Ernest Hemingway'

Wenn Sie die Eingabeparameter in einer anderen Reihenfolge angeben möchten als in der Prozedur deklariert, können Sie den Parameternamen angeben und Werte zuweisen. Zum Beispiel

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

    SELECT
        Param1 = @Param1,
        Param2 = @Param2

END

Die normale Reihenfolge zum Ausführen dieser Prozedur besteht darin, zuerst den Wert für @ Param1 und dann für @ Param2 anzugeben. So wird es ungefähr so ​​aussehen

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

Es ist jedoch auch möglich, dass Sie Folgendes verwenden können

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

Dabei legen Sie zuerst den Wert für @ param2 und @ Param1 Sekunde fest. Das bedeutet, dass Sie nicht die gleiche Reihenfolge einhalten müssen, wie sie in der Prozedur angegeben ist. Sie können jedoch eine beliebige Reihenfolge haben, wie Sie möchten. Sie müssen jedoch angeben, für welchen Parameter Sie den Wert einstellen

Greifen Sie auf eine gespeicherte Prozedur aus einer beliebigen Datenbank zu

Außerdem können Sie eine Prozedur mit einem Präfix sp_ Diese Procuedres können wie alle gespeicherten Systemprozeduren aufgrund des Standardverhaltens von SQL Server ohne Angabe der Datenbank ausgeführt werden. Wenn Sie eine gespeicherte Prozedur ausführen, die mit "sp_" beginnt, sucht SQL Server zuerst nach der Prozedur in der Master-Datenbank. Wenn die Prozedur nicht im Master gefunden wird, wird in der aktiven Datenbank gesucht. Wenn Sie über eine gespeicherte Prozedur verfügen, auf die Sie aus allen Datenbanken zugreifen möchten, erstellen Sie sie in master und verwenden Sie einen Namen, der das Präfix "sp_" enthält.

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

GESPEICHERTES VERFAHREN mit OUT-Parametern

Gespeicherte Prozeduren können Werte mit dem Schlüsselwort OUTPUT in ihrer Parameterliste zurückgeben.

Erstellen einer gespeicherten Prozedur mit einem einzelnen Out-Parameter

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

Ausführen der gespeicherten Prozedur

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

Erstellen einer gespeicherten Prozedur mit mehreren Out-Parametern

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

Ausführen der gespeicherten Prozedur

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

Gespeicherte Prozedur mit If ... Else und Insert Ino Operation

Erstellen Sie eine Beispieltabelle Employee :

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

Erstellt eine gespeicherte Prozedur, die prüft, ob die in der gespeicherten Prozedur übergebenen Werte nicht null oder nicht leer sind, und führt eine Einfügeoperation in der Employee-Tabelle aus.

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

Führen Sie die gespeicherte Prozedur aus

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

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

Dynamisches SQL in gespeicherter Prozedur

Mit Dynamic SQL können wir zur Laufzeit SQL-Anweisungen generieren und ausführen. Dynamisches SQL ist erforderlich, wenn unsere SQL-Anweisungen einen Bezeichner enthalten, der sich zu verschiedenen Kompilierungszeiten ändern kann.

Einfaches Beispiel für dynamisches 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

In der obigen SQL-Abfrage können wir sehen, dass wir die obige Abfrage verwenden @table_name, @col_name, and @col_value zur Laufzeit Werte in @table_name, @col_name, and @col_value . Die Abfrage wird zur Laufzeit generiert und ausgeführt. Dies ist eine Technik, bei der wir ganze Skripte als String in einer Variablen erstellen und ausführen können. Wir können komplexere Abfragen mit dynamischen SQL- und Verkettungskonzepten erstellen. Dieses Konzept ist sehr nützlich, wenn Sie ein Skript erstellen möchten, das unter verschiedenen Bedingungen verwendet werden kann.

Gespeicherte Prozedur ausführen

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

Tabelle, die ich verwendet habe

Geben Sie hier die Bildbeschreibung ein

Ausgabe

Geben Sie hier die Bildbeschreibung ein

Einfaches Looping

#systables uns zunächst einige Daten in eine temporäre Tabelle mit dem Namen #systables und eine #systables sodass wir jeweils einen Datensatz abfragen können

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

Als Nächstes deklarieren wir einige Variablen zur Steuerung der Schleife und speichern den Tabellennamen in diesem Beispiel

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

Jetzt können wir eine einfache Schleife verwenden. Wir @rn in der select Anweisung, dies könnte jedoch auch eine separate Anweisung für ex set @rn = @rn + 1 sein, je nach Ihren Anforderungen. Wir verwenden auch den Wert von @rn bevor er erhöht wird, um einen einzelnen Datensatz aus #systables . Zuletzt drucken wir den Tabellennamen.

while @rn <= @maxRn
    begin

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

        print @tablename
    end

Einfaches Looping

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow