私は顧客がオンラインで、カートモデルなどで注文するウェブサイトを持っています。
問題は、注文が記録されていることを知っていたとき、注文テーブルのエントリ、在庫テーブルからの控除、販売テーブルの更新など、更新する必要があるさまざまな情報があり、現在、各クエリを一度実行してこれを行っていることです次のクエリは前のクエリからの情報を必要とするため、データベースは要件に従って結果を変更し、別のクエリを実行して結果を更新します。
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);
そしてもちろん、これは何らかの方法で何度も何度もデータベースを行き来するのに最適な方法ではありません。SQLServer Stored Procedures
を経由する方が良いと思います。しかし、多くのことを試してみた後でも、クエリの結果をSP
変数に格納し、その内部で使用する方法の例を見つけることができませんでした。
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
これは可能ですか?はいの場合、どのようにガイドしてください。
はい、これはもちろん可能です。以下に例を示します。
-- 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
この例を試してください
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
ストアドプロシージャを呼び出すSQLコマンド
EXEC MyProc
または、ストアドプロシージャを作成して呼び出す代わりに、1つのSQLコマンドを使用できます。
INSERT INTO [order_cart](orId,caId)
OUTPUT inserted.*
SELECT
(SELECT MAX(orId) FROM [order]) as orId,
(SELECT MAX(caId) FROM [cart]) as caId;