27

私は顧客がカートモデルなどでオンラインで注文するウェブサイトを持っています.

問題は、注文が記録されていることを知っていたときに、注文テーブルのエントリ、在庫テーブルからの控除、販売テーブルの更新など、更新する必要があるさまざまな情報があることです。現在、各クエリを 1 回ずつ実行してこれを行っています。次のクエリは前のクエリからの情報を必要とするため、データベースは要件に従って結果を変更してから、別のクエリを実行して結果を更新します。

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

そしてもちろん、これはデータベースに何度も何度も行ったり来たりするのに最適な方法ではありません.SQL Serverを介して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

これを行うことは可能ですか?はいの場合は、どのようにガイドしてください。

4

3 に答える 3

33

はい、もちろん可能です。ここにいくつかの例があります。

-- 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
于 2013-07-19T09:43:18.557 に答える
10

この例を試してください

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
于 2013-07-19T07:43:55.590 に答える