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.
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.
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.
@retvalOUT=@retval OUTPUT
? Le troisième paramètre de la fonction sp_executesql
être juste @retval OUTPUT
?
Juste une question tangentielle, qu'en est-il de plus d'un OUTPUT ? à quoi ressemblerait la requête ?
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
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 !
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.
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 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.