T-SQL saklı yordamın SEÇİLEN değerini al


95

T-SQL'de buna izin verilir:

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

Yani, bir SELECT'in değerini almak ve onu bir değişkene koymak mümkündür (tabii ki skaler olması koşuluyla).

Aynı seçim mantığını bir saklı yordama koyarsam:

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

Bu saklı yordamın çıktısını alıp bir değişkene yerleştirebilir miyim?

Gibi bir şey:

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

(Denediğim için yukarıdaki sözdizimine izin verilmediğini biliyorum!)

Yanıtlar:


192

kullanabileceğiniz üç yol vardır: RETURN değeri ve OUTPUT parametresi ve bir sonuç kümesi

AYRICA, kalıbı kullanıp kullanmadığınıza dikkat edin: SELECT @Variable=column FROM table ...

Sorgudan döndürülen birden fazla satır varsa, @ Değişkeniniz yalnızca sorgu tarafından döndürülen son satırdaki değeri içerecektir.

DÖNÜŞ DEĞERİ
, sorgunuz en azından nasıl adlandırdığınıza bağlı olarak bir int alanı döndürdüğünden. bu numarayı kullanabilirsin:

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

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

ve şimdi prosedürünüzü şu şekilde arayın:

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

bu yalnızca INT'ler için işe yarar, çünkü RETURN yalnızca tek bir int değeri döndürebilir ve null'lar sıfıra dönüştürülür.

ÇIKIŞ PARAMETRESİ
bir çıkış parametresi kullanabilirsiniz:

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

ve şimdi prosedürünüzü şu şekilde arayın:

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

Çıktı parametreleri yalnızca bir değer döndürebilir, ancak herhangi bir veri türü olabilir

Sonuç kümesi için SONUÇ SETİ prosedürü aşağıdaki gibi yapın:

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

şu şekilde kullanın:

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

sonuç kümelerinde birçok satır ve herhangi bir veri türünden birçok sütun olabilir


5
Sonuç kümesi yaklaşımının, yalnızca bir kayıt döndürülse bile bu tablo / ekleme kullanımını gerektirdiğini unutmayın. Doğrudan bir değişkene bir kısayol arıyordum, ama yok.
goodeye

Birden çok satırlı sonuçta 'dönüş değeri' ve 'çıktı parametresi' yaklaşımını kullanmak mümkün müdür?
ji-ruh

@ ji-ruh, saklı yordam birini, hiçbirini, bir kısmını veya tümünü kullanabilir: sonuç kümesi, döndürme çıktı parametreleri ve / veya dönüş değeri
KM.

4

Bir kombinasyon da vardır, bir kayıt kümesiyle bir dönüş değeri kullanabilirsiniz:

--Saklı yordam--

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

--Çağrı Kodu--

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

--Sonuçlar--

görüntü açıklamasını buraya girin


Bu sonuçları php olarak nasıl alırım?
HagaHood

3

Dönüş değerlerini kullanmanız gerekir.

DECLARE @SelectedValue int

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

O zaman buna şöyle diyorsun:

EXEC GetMyInt OUTPUT @SelectedValue

2

Bunu deneyin:

EXEC @SelectedValue = GetMyInt

7
Bu yanlış. Bir SELECT ifadesi, SPROC içinde belirtilmediği sürece SPROC'un dönüş değeri olmaz.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.