T-SQL mendapatkan nilai prosedur tersimpan yang DIPILIH

95

Di T-SQL, ini diperbolehkan:

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

Jadi, dimungkinkan untuk mendapatkan nilai SELECT dan memasukkannya ke dalam variabel (asalkan skalar itu, jelas).

Jika saya meletakkan logika pilih yang sama dalam prosedur tersimpan:

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

Bisakah saya mendapatkan output dari prosedur tersimpan ini dan memasukkannya ke dalam variabel?

Sesuatu seperti:

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

(Saya tahu sintaks di atas tidak diperbolehkan karena saya mencobanya!)

David
sumber

Jawaban:

191

ada tiga cara yang dapat Anda gunakan: nilai RETURN, dan parameter OUTPUT dan kumpulan hasil

JUGA, hati-hati jika Anda menggunakan pola: SELECT @Variable=column FROM table ...

jika ada beberapa baris yang dikembalikan dari kueri, @Variable Anda hanya akan berisi nilai dari baris terakhir yang dikembalikan oleh kueri.

KEMBALIKAN NILAI
karena kueri Anda mengembalikan bidang int, setidaknya berdasarkan bagaimana Anda menamainya. Anda bisa menggunakan trik ini:

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

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

dan sekarang panggil prosedur Anda seperti:

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

ini hanya akan bekerja untuk INT, karena RETURN hanya dapat mengembalikan satu nilai int dan null diubah menjadi nol.

PARAMETER OUTPUT
Anda dapat menggunakan parameter output:

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

dan sekarang panggil prosedur Anda seperti:

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

Parameter keluaran hanya dapat mengembalikan satu nilai, tetapi dapat berupa tipe data apa pun

RESULT SET untuk hasil set membuat prosedur seperti:

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

gunakan seperti:

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

kumpulan hasil dapat memiliki banyak baris dan banyak kolom dari semua tipe data

KM.
sumber
5
Perhatikan bahwa pendekatan kumpulan hasil memerlukan penggunaan tabel / sisipkan ini, meskipun hanya satu catatan yang dikembalikan. Saya sedang mencari jalan pintas langsung ke variabel, tetapi tidak ada.
selamat tinggal
apakah mungkin untuk menggunakan pendekatan 'nilai kembali' dan 'parameter keluaran' dalam hasil beberapa baris?
ji-ruh
@ ji-ruh, prosedur tersimpan dapat menggunakan satu, tidak ada, beberapa, atau semua: kumpulan hasil, parameter keluaran kembali, dan / atau nilai kembali
KM.
4

Ada juga kombinasi, Anda dapat menggunakan nilai pengembalian dengan kumpulan data:

--Prosedur Tersimpan--

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

--Kode Panggilan--

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

--Hasil--

masukkan deskripsi gambar di sini

markpcasey
sumber
Bagaimana cara mendapatkan hasil ini di php?
HagaHood
3

Anda perlu menggunakan nilai kembali.

DECLARE @SelectedValue int

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

Kemudian Anda menyebutnya seperti ini:

EXEC GetMyInt OUTPUT @SelectedValue

sumber
2

Coba lakukan ini:

EXEC @SelectedValue = GetMyInt
Kode Wolfe
sumber
7
Ini salah Pernyataan SELECT tidak menjadi nilai kembalian SPROC kecuali ditentukan di dalam SPROC.