186 votes

Comment obtenir le résultat de sp_executesql dans une variable ?

J'ai un morceau de SQL dynamique à exécuter, je dois ensuite stocker le résultat dans une variable.

Je sais que je peux utiliser sp_executesql mais je ne trouve pas d'exemples clairs sur la manière de procéder.

268voto

Eduardo Molteni Points 23135

Si vous avez des paramètres de SORTIE, vous pouvez faire ce qui suit

DECLARE @retval int   
DECLARE @sSQL nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);

DECLARE @tablename nvarchar(50)  
SELECT @tablename = N'products'  

SELECT @sSQL = N'SELECT @retvalOUT = MAX(ID) FROM ' + @tablename;  
SET @ParmDefinition = N'@retvalOUT int OUTPUT';

EXEC sp_executesql @sSQL, @ParmDefinition, @retvalOUT=@retval OUTPUT;

SELECT @retval;

Mais si vous ne le faites pas, vous ne pouvez pas modifier le PS :

-- Assuming that your SP return 1 value
create table #temptable (ID int null)
insert into #temptable exec mysp 'Value1', 'Value2'
select * from #temptable

Ce n'est pas joli, mais ça marche.

0 votes

Mon sp sera sp_executesql @myQuery

1 votes

@retvalOUT=@retval OUTPUT ? Le troisième paramètre de la fonction sp_executesql être juste @retval OUTPUT ?

2 votes

Juste une question tangentielle, qu'en est-il de plus d'un OUTPUT ? à quoi ressemblerait la requête ?

51voto

Nishanth Points 119
DECLARE @tab AS TABLE (col1 VARCHAR(10), col2 varchar(10)) 
INSERT into @tab EXECUTE  sp_executesql N'
SELECT 1 AS col1, 2 AS col2
UNION ALL
SELECT 1 AS col1, 2 AS col2
UNION ALL
SELECT 1 AS col1, 2 AS col2'

SELECT * FROM @tab

0 votes

J'ai déjà utilisé cette méthode. Elle ne semble fonctionner que pour le premier insert into @tab . Si vous essayez de insert into @tab et exécuter plusieurs execute sp_executesql , avec un sql différent, select * from @tab n'affiche que les résultats de la première exécution

0 votes

Oops, my bad. Il y avait une erreur dans ma deuxième sélection, ce qui signifiait qu'elle renvoyait zéro ligne. Cette méthode fonctionne très bien et ne nécessite pas de table temporaire !

0 votes

C'est la meilleure réponse. Bien que j'aie eu besoin d'exécuter du SQL dynamique, ce qui signifie que vous devez d'abord intégrer votre SQL dynamique dans un paramètre, c'est-à-dire déclarer @SQL nvarchar(255) = N'Select 20' - puis simplement sl_executeSql en passant le paramètre à la place.

47voto

Buchaiah Points 59
DECLARE @vi INT
DECLARE @vQuery NVARCHAR(1000)

SET @vQuery = N'SELECT @vi= COUNT(*) FROM <TableName>'

EXEC SP_EXECUTESQL 
        @Query  = @vQuery
      , @Params = N'@vi INT OUTPUT'
      , @vi = @vi OUTPUT

SELECT @vi

8 votes

Où se trouve la déclaration des variables viOUTPUT et viINT ?

1 votes

Celui-ci a fonctionné pour moi. La réponse avec le plus de votes n'a pas fonctionné

5 votes

Paramètre @vQuery MUST doit être déclarée comme NVARCHAR et non VARCHAR.

3voto

Mark Hedley Points 47
Declare @variable int
Exec @variable = proc_name

3voto

Gizmo Points 489

Les valeurs de retour ne sont généralement pas utilisées pour "renvoyer" un résultat, mais pour renvoyer un succès (0) ou un numéro d'erreur (1-65K). Ce qui précède semble indiquer que sp_executesql ne renvoie pas de valeur, ce qui n'est pas correct. sp_executesql renvoie 0 en cas de succès et n'importe quel autre nombre en cas d'échec.

Dans l'exemple ci-dessous, @i renvoie 2727

DECLARE @s NVARCHAR(500)
DECLARE @i INT;
SET @s = 'USE [Blah]; UPDATE STATISTICS [dbo].[TableName] [NonExistantStatisticsName];';
EXEC @i = sys.sp_executesql @s
SELECT @i AS 'Blah'

SSMS affichera ceci Msg 2727, Niveau 11, État 1, Ligne 1 Impossible de trouver l'index 'NonExistantStaticsName'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X