T-SQL รับค่าที่เลือกของกระบวนงานที่เก็บไว้


95

ใน T-SQL อนุญาตให้ใช้:

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

ดังนั้นจึงเป็นไปได้ที่จะรับค่าของ SELECT และใส่ไว้ในตัวแปร (หากเป็นสเกลาร์อย่างชัดเจน)

ถ้าฉันใส่ตรรกะการเลือกเดียวกันในขั้นตอนการจัดเก็บ:

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

ฉันสามารถรับผลลัพธ์ของกระบวนงานที่เก็บไว้นี้และบรรจุไว้ในตัวแปรได้หรือไม่

สิ่งที่ต้องการ:

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

(ฉันรู้ว่าไม่อนุญาตให้ใช้ไวยากรณ์ด้านบนเพราะฉันลองแล้ว!)

คำตอบ:


192

มีสามวิธีที่คุณสามารถใช้ได้: ค่า RETURN และพารามิเตอร์ OUTPUT และชุดผลลัพธ์

นอกจากนี้โปรดระวังว่าคุณใช้รูปแบบ: SELECT @Variable=column FROM table ...

หากมีหลายแถวที่ส่งคืนจากการค้นหา @Variable ของคุณจะมีเฉพาะค่าจากแถวสุดท้ายที่ส่งคืนโดยแบบสอบถาม

ส่งกลับค่า
เนื่องจากการสืบค้นของคุณส่งคืนฟิลด์ int อย่างน้อยก็ขึ้นอยู่กับวิธีที่คุณตั้งชื่อ คุณสามารถใช้เคล็ดลับนี้:

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

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

และตอนนี้เรียกขั้นตอนของคุณเช่น:

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

สิ่งนี้จะใช้ได้กับ INT เท่านั้นเนื่องจาก RETURN สามารถส่งคืนค่า int ได้เพียงค่าเดียวและค่า null จะถูกแปลงเป็นศูนย์

OUTPUT PARAMETER
คุณสามารถใช้พารามิเตอร์เอาต์พุต:

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

และตอนนี้เรียกขั้นตอนของคุณเช่น:

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

พารามิเตอร์เอาต์พุตสามารถคืนค่าได้เพียงค่าเดียว แต่สามารถเป็นข้อมูลประเภทใดก็ได้

RESULT SET สำหรับชุดผลลัพธ์ให้ทำตามขั้นตอนดังนี้:

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

ใช้มันเช่น:

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

ชุดผลลัพธ์สามารถมีหลายแถวและหลายคอลัมน์ในประเภทข้อมูลใดก็ได้


5
โปรดสังเกตว่าแนวทางชุดผลลัพธ์ต้องการการใช้ตาราง / แทรกนี้แม้ว่าจะส่งคืนระเบียนเดียวก็ตาม ฉันกำลังมองหาทางลัดไปยังตัวแปรโดยตรง แต่ไม่มีเลย
goodeye

เป็นไปได้หรือไม่ที่จะใช้แนวทาง 'return value' และ 'output parameters' ในผลลัพธ์หลายแถว
ji-ruh

@ ji-ruh โพรซีเดอร์ที่เก็บไว้สามารถใช้หนึ่ง, ไม่มี, บางส่วนหรือทั้งหมด: ชุดผลลัพธ์, พารามิเตอร์เอาต์พุตที่ส่งคืนและ / หรือค่าส่งคืน
KM

4

นอกจากนี้ยังมีการรวมกันคุณสามารถใช้ค่าส่งคืนกับชุดระเบียน:

--ขั้นตอนการเก็บ--

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

- รหัสการโทร -

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

--ผล--

ป้อนคำอธิบายภาพที่นี่


ฉันจะได้ผลลัพธ์นี้ใน php ได้อย่างไร?
HagaHood

3

คุณต้องใช้ค่าที่ส่งคืน

DECLARE @SelectedValue int

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

จากนั้นคุณเรียกสิ่งนี้ว่า:

EXEC GetMyInt OUTPUT @SelectedValue

2

ลองทำสิ่งนี้:

EXEC @SelectedValue = GetMyInt

7
สิ่งนี้ไม่ถูกต้อง คำสั่ง SELECT จะไม่กลายเป็นค่าส่งคืนของ SPROC เว้นแต่จะระบุไว้ใน SPROC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.