T-SQL obtém o valor SELECT do procedimento armazenado

95

No T-SQL, isso é permitido:

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

Portanto, é possível obter o valor de um SELECT e colocá-lo em uma variável (desde que seja escalar, obviamente).

Se eu colocar a mesma lógica de seleção em um procedimento armazenado:

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

Posso obter a saída deste procedimento armazenado e colocá-la em uma variável?

Algo como:

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

(Eu sei que a sintaxe acima não é permitida porque eu tentei!)

David
fonte

Respostas:

191

Existem três maneiras de usar: o valor RETURN, o parâmetro OUTPUT e um conjunto de resultados

TAMBÉM, cuidado se você usar o padrão: SELECT @Variable=column FROM table ...

se houver várias linhas retornadas da consulta, sua @Variable conterá apenas o valor da última linha retornada pela consulta.

VALOR DE RETORNO,
pois sua consulta retorna um campo int, pelo menos com base em como você o nomeou. você pode usar este truque:

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

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

e agora chame seu procedimento como:

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

isso só funcionará para INTs, porque RETURN só pode retornar um único valor int e os nulos são convertidos em zero.

OUTPUT PARAMETER
você pode usar um parâmetro de saída:

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

e agora chame seu procedimento como:

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

Os parâmetros de saída podem retornar apenas um valor, mas podem ser de qualquer tipo de dados

RESULT SET para um conjunto de resultados, faça o procedimento como:

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

use-o como:

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

os conjuntos de resultados podem ter muitas linhas e muitas colunas de qualquer tipo de dados

KM.
fonte
5
Observe que a abordagem do conjunto de resultados requer este uso de tabela / inserção, mesmo se apenas um registro for retornado. Eu estava procurando um atalho diretamente para uma variável, mas não há um.
goodeye
é possível usar a abordagem 'valor de retorno' e 'parâmetro de saída' no resultado de várias linhas?
ji-ruh
@ ji-ruh, um procedimento armazenado pode usar um, nenhum, alguns ou todos: conjunto de resultados, parâmetros de saída de retorno e / ou valor de retorno
KM.
4

Também há uma combinação, você pode usar um valor de retorno com um conjunto de registros:

--Procedimento armazenado--

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

- Código de Chamada--

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

--Resultados--

insira a descrição da imagem aqui

markpcasey
fonte
Como faço para obter esses resultados em php?
HagaHood
3

Você precisaria usar valores de retorno.

DECLARE @SelectedValue int

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

Então você chama assim:

EXEC GetMyInt OUTPUT @SelectedValue

fonte
2

Tente fazer isso:

EXEC @SelectedValue = GetMyInt
Código Wolfe
fonte
7
Isso está incorreto. Uma instrução SELECT não se torna o valor de retorno do SPROC, a menos que seja especificado dentro do SPROC.