web-dev-qa-db-fra.com

set @var = exec stored_procedure

Est-il possible d'affecter à une variable une valeur renvoyée par la procédure stockée exec?

Quelque chose comme

DECLARE @count int
SET @count = Execute dbo.usp_GetCount @Id=123
13
BumbleBee

Vous pouvez utiliser sp_executesql au lieu de exec à affecter aux paramètres de sortie scalaire

DECLARE @out int

EXEC sp_executesql N'select @out_param=10',
                   N'@out_param int OUTPUT',
                     @out_param=@out OUTPUT

SELECT @out

Pour exec je ne sais que faire avec une variable de table

declare @out table
(
out int
)

insert into @out
exec('select 10')

select * 
from @out

Pour les procédures stockées, vous utiliseriez également un paramètre output ou un code retour. Ce dernier ne peut renvoyer qu'un seul entier et est généralement préféré pour renvoyer des codes d'erreur plutôt que des données. Les deux techniques sont présentées ci-dessous.

create proc #foo 
@out int output
as
set @out = 100
return 99

go

declare @out int, @return int

exec @return = #foo @out output

select @return as [@return], @out as [@out]

drop proc #foo
25
Martin Smith

Si vous utilisez RETURN dans le proc

DECLARE @count int
EXECUTE @count = dbo.usp_GetCount @Id=123

Paramètre OUTPUT

DECLARE @count int
EXECUTE dbo.usp_GetCount @Id=123, @count OUTPUT

Redirige les résultats vers la table/variable de table temporaire

DECLARE @count int
DECLARE @cache TABLE (CountCol int NOT NULL)
INSERT @cache EXECUTE dbo.usp_GetCount @Id=123
SELECT @count = CountCol FROM @cache

Vous ne pouvez pas affecter un jeu d'enregistrements du proc stocké directement à une variable scalaire

23
gbn

Comme d'habitude, de nombreuses façons de le faire, mais la plus simple est:

DECLARE @count int

Execute @count =  dbo.usp_GetCount @Id=123
10
Mark Hedley