T-SQL nhận giá trị được CHỌN của thủ tục được lưu trữ


95

Trong T-SQL, điều này được phép:

DECLARE @SelectedValue int
SELECT @SelectedValue = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

Vì vậy, có thể lấy giá trị của một SELECT và nhét nó vào một biến (rõ ràng là nó vô hướng).

Nếu tôi đặt cùng một lôgic chọn trong một quy trình được lưu trữ:

CREATE PROCEDURE GetMyInt
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

Tôi có thể lấy đầu ra của thủ tục đã lưu trữ này và nhét nó vào một biến không?

Cái gì đó như:

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

(Tôi biết cú pháp trên không được phép vì tôi đã thử nó!)

Câu trả lời:


191

có ba cách bạn có thể sử dụng: giá trị RETURN và tham số OUTPUT và tập hợp kết quả

CŨNG, hãy để ý nếu bạn sử dụng mẫu: SELECT @Variable=column FROM table ...

nếu có nhiều hàng được trả về từ truy vấn, thì @Variable của bạn sẽ chỉ chứa giá trị từ hàng cuối cùng mà truy vấn trả về.

RETURN VALUE
vì truy vấn của bạn trả về một trường int, ít nhất là dựa trên cách bạn đặt tên cho nó. bạn có thể sử dụng thủ thuật này:

CREATE PROCEDURE GetMyInt
( @Param int)
AS
DECLARE @ReturnValue int

SELECT @ReturnValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN @ReturnValue
GO

và bây giờ gọi thủ tục của bạn như:

DECLARE @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC @SelectedValue = GetMyInt @Param
PRINT @SelectedValue

điều này sẽ chỉ hoạt động đối với INT, vì RETURN chỉ có thể trả về một giá trị int duy nhất và giá trị null được chuyển đổi thành số không.

THAM SỐ OUTPUT
bạn có thể sử dụng một tham số đầu ra:

CREATE PROCEDURE GetMyInt
( @Param     int
 ,@OutValue  int OUTPUT)
AS
SELECT @OutValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN 0
GO

và bây giờ gọi thủ tục của bạn như:

DECLARE @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC GetMyInt @Param, @SelectedValue OUTPUT
PRINT @SelectedValue 

Tham số đầu ra chỉ có thể trả về một giá trị nhưng có thể là bất kỳ kiểu dữ liệu nào

RESULT SET cho một tập kết quả thực hiện quy trình như sau:

CREATE PROCEDURE GetMyInt
( @Param     int)
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN 0
GO

sử dụng nó như:

DECLARE @ResultSet table (SelectedValue int)
DECLARE @Param int
SET @Param=1
INSERT INTO @ResultSet (SelectedValue)
    EXEC GetMyInt @Param
SELECT * FROM @ResultSet 

tập kết quả có thể có nhiều hàng và nhiều cột thuộc bất kỳ kiểu dữ liệu nào


5
Lưu ý rằng cách tiếp cận tập kết quả yêu cầu sử dụng bảng / chèn này, ngay cả khi chỉ trả về một bản ghi. Tôi đã tìm kiếm một lối tắt trực tiếp vào một biến, nhưng không có.
goodeye

có thể sử dụng phương pháp tiếp cận 'giá trị trả về' và 'tham số đầu ra' trong kết quả nhiều hàng không?
ji-ruh

@ ji-ruh, một thủ tục được lưu trữ có thể sử dụng một, không, một số hoặc tất cả: tập kết quả, tham số đầu ra trả về và / hoặc giá trị trả về
KM.

4

Ngoài ra còn có sự kết hợp, bạn có thể sử dụng giá trị trả về với một tập bản ghi:

- Thủ tục lưu trữ--

CREATE PROCEDURE [TestProc]

AS
BEGIN

    DECLARE @Temp TABLE
    (
        [Name] VARCHAR(50)
    )

    INSERT INTO @Temp VALUES ('Mark') 
    INSERT INTO @Temp VALUES ('John') 
    INSERT INTO @Temp VALUES ('Jane') 
    INSERT INTO @Temp VALUES ('Mary') 

    -- Get recordset
    SELECT * FROM @Temp

    DECLARE @ReturnValue INT
    SELECT @ReturnValue = COUNT([Name]) FROM @Temp

    -- Return count
    RETURN @ReturnValue

END

--Mã gọi--

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

--Các kết quả--

nhập mô tả hình ảnh ở đây


Làm cách nào để nhận kết quả này trong php?
HagaHood

3

Bạn cần phải sử dụng các giá trị trả về.

DECLARE @SelectedValue int

CREATE PROCEDURE GetMyInt (@MyIntField int OUTPUT)
AS
SELECT @MyIntField = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

Sau đó, bạn gọi nó như thế này:

EXEC GetMyInt OUTPUT @SelectedValue

2

Hãy thử làm điều này:

EXEC @SelectedValue = GetMyInt

7
Điều này là không đúng. Câu lệnh SELECT không trở thành giá trị trả về của SPROC trừ khi được chỉ định bên trong SPROC.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.