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.
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
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
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;