【问题标题】:Storing query results into a variable and modifying it inside a Stored Procedure将查询结果存储到变量中并在存储过程中对其进行修改
【发布时间】:2013-07-18 08:22:36
【问题描述】:

我有一个网站,客户可以在该网站上以购物车模型等方式在线订购商品。

问题是,当我知道订单已记录时,需要更新不同的信息,例如订单表中的条目、库存表中的扣款、更新销售表等,而我目前正在通过运行每个查询来做到这一点数据库根据要求修改其结果然后运行另一个查询来更新结果的时间,因为下一个查询需要前一个查询的信息:

        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

可以这样做吗?如果是,请指导。

【问题讨论】:

标签: sql-server asp.net-mvc sql-server-2008 stored-procedures


【解决方案1】:

是的,这当然是可能的。这里有几个例子。

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

【讨论】:

    【解决方案2】:

    试试这个例子

    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
    

    【讨论】:

      【解决方案3】:

      或者您可以使用一个 SQL 命令代替创建和调用存储过程

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

      【讨论】:

        猜你喜欢
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多