web-dev-qa-db-fra.com

Stockage des résultats de la requête dans une variable et modification dans une procédure stockée

J'ai un site Web où le client commande des trucs en ligne, dans un modèle de chariot, etc.

Le problème est que lorsque je savais que la commande était enregistrée, différentes informations devaient être mises à jour, telles que la saisie dans la table des commandes, les déductions de la table des stocks, la mise à jour de la table des ventes, etc. base de données obtenant son résultat en modifiant selon les exigences, puis exécutez une autre requête pour mettre à jour le résultat, car la requête suivante nécessite des informations de la précédente:

        bool stts = false;
        int re1 = 0, re2 = 0, re3 = 0;
        short maxOr = 0, maxCa = 0, maxOc = 0;
        SqlConnection conn= Shared.GetSqlCon(); //Make connection object

        conn= Shared.GetSqlCon();
        var comm1 = new Commmand("SELECT MAX(orId) FROM [order];", sqlCon);
        maxOr = Shared.OSC(sqlCon, comm1);
        Shared.COC(sqlCon); //Close & Dispose connections

        conn= Shared.GetSqlCon();
        var comm2 = new Commmand("SELECT MAX(caId) FROM [cart];", sqlCon);
        maxCa = Shared.OSC(sqlCon, comm2);
        Shared.COC(sqlCon);

        conn= Shared.GetSqlCon();
        var comm3 = new Commmand("INSERT INTO [order_cart](orId,caId) VALUES(@maxOr,@maxCa);", sqlCon);
        comm3.Parameters.AddWithValue("@maxOr", maxOr + 1);
        comm3.Parameters.AddWithValue("@maxCa", maxCa + 1);

Et bien sûr, ce n'est en aucun cas un excellent moyen de le faire aller et venir dans la base de données encore et encore et je pense que le faire via SQL Server Stored Procedures serait une meilleure idée. Mais même après avoir essayé et trouvé beaucoup de choses, je ne pouvais pas trouver un exemple de comment stocker le résultat d'une requête dans une variable SP et l'utiliser à l'intérieur, un peu comme ceci:

Declare @myVar int //Stored Procedure variable
@myVar = SELECT MAX(caId) FROM [cart] //Getting query result in the variable
INSERT INTO [order_cart](orId,caId) VALUES(@maxOr, @myVar); //Updating record through the variable
return @myVar //return variable value to the program

Est-ce possible de faire cela? Si oui, veuillez guider.

18
Maven

Oui, c'est possible bien sûr. Voici plusieurs exemples.

-- one way to do this
DECLARE @Cnt int

SELECT @Cnt = COUNT(SomeColumn)
FROM TableName
GROUP BY SomeColumn

-- another way to do the same thing
DECLARE @StreetName nvarchar(100)
SET @StreetName = (SELECT Street_Name from Streets where Street_ID = 123)

-- Assign values to several variables at once
DECLARE @val1 nvarchar(20)
DECLARE @val2 int
DECLARE @val3 datetime
DECLARE @val4 uniqueidentifier
DECLARE @val5 double

SELECT @val1 = TextColumn,
@val2 = IntColumn,
@val3 = DateColumn,
@val4 = GuidColumn,
@val5 = DoubleColumn
FROM SomeTable
24
Joel Cuff

Essayez cet exemple

CREATE PROCEDURE MyProc
BEGIN
    --Stored Procedure variables
    Declare @maxOr int; 
    Declare @maxCa int; 

    --Getting query result in the variable (first variant of syntax)
    SET @maxOr = (SELECT MAX(orId) FROM [order]); 

    --Another variant of seting variable from query
    SELECT @maxCa=MAX(caId) FROM [cart]; 

    --Updating record through the variable
    INSERT INTO [order_cart] (orId,caId)
    VALUES(@maxOr, @maxCa); 

    --return values to the program as dataset
    SELECT
       @maxOr AS maxOr,
       @maxCa AS maxCa

    -- return one int value as "return value"
    RETURN @maxOr
END
GO

Commande SQL pour appeler la procédure stockée

EXEC MyProc
7
Alexander Sigachov

Ou vous pouvez utiliser une commande SQL au lieu de créer et d'appeler une procédure stockée

INSERT INTO [order_cart](orId,caId)
OUTPUT inserted.*
SELECT
   (SELECT MAX(orId) FROM [order]) as orId,
   (SELECT MAX(caId) FROM [cart]) as caId;
0
Alexander Sigachov