Câu hỏi Lưu trữ kết quả truy vấn vào một biến và sửa đổi nó bên trong một thủ tục lưu trữ


Tôi có một trang web nơi khách hàng đặt hàng trực tuyến, trong một mô hình giỏ hàng, v.v.

Các vấn đề là khi tôi biết thứ tự được ghi lại, có các thông tin khác nhau cần được cập nhật như mục nhập trong bảng thứ tự, các khoản khấu trừ từ bảng chứng khoán, cập nhật bảng bán hàng, v.v ... và hiện tại tôi đang thực hiện điều này bằng cách chạy từng truy vấn một lần cơ sở dữ liệu nhận được kết quả của nó sửa đổi theo yêu cầu và sau đó chạy một truy vấn khác để cập nhật kết quả, vì truy vấn tiếp theo yêu cầu thông tin từ trước đó:

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

Và tất nhiên điều này trong bất kỳ cách nào không phải là một cách tuyệt vời để làm điều đó đi qua lại cho cơ sở dữ liệu một lần nữa và một lần nữa và tôi nghĩ rằng sẽ đi qua SQL Server Stored Procedures sẽ là một ý tưởng tốt hơn. Nhưng ngay cả sau khi cố gắng và tìm kiếm nhiều, tôi không thể tìm thấy ví dụ về cách lưu trữ kết quả của truy vấn trong SP biến và sử dụng nó bên trong nó, giống như thế này:

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

Điều này có thể thực hiện được điều này không? Nếu có hơn làm thế nào xin vui lòng hướng dẫn.


17
2017-07-19 06:32


gốc


Nó sẽ giúp cho sự khởi đầu của những phát hiện? stackoverflow.com/questions/7542517/… - Serg


Các câu trả lời:


Yup, điều này là có thể tất nhiên. Dưới đây là một số ví dụ.

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

23
2017-07-19 09:43





Thử ví dụ này

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

Lệnh SQL để gọi thủ tục lưu sẵn

EXEC MyProc

6
2017-07-19 07:43





Hoặc bạn có thể sử dụng một lệnh SQL thay vì tạo và gọi thủ tục lưu sẵn

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

0
2017-07-19 07:52