Paramètres d'impression dans Dynamic SQL


9

J'ai utilisé SQL dynamique pour de nombreuses tâches et je rencontre continuellement le même problème: l'impression des valeurs des variables utilisées dans l'instruction Dynamic T-SQL.

PAR EXEMPLE:

Declare @SQL nvarchar(max), @Params nvarchar(max), @DebugMode bit, @Foobar int
select @DebugMode=1,@Foobar=364556423

set @SQL='Select @Foobar'
set @Params=N'@Foobar int'

if @DebugMode=1 print @SQL
exec sp_executeSQL @SQL,@Params
    ,@Foobar=@Foobar

Les résultats d'impression du code ci-dessus sont simplement "Select @Foobar". Existe-t-il un moyen d'imprimer dynamiquement les valeurs et les noms de variables du SQL en cours d'exécution? Ou lorsque vous effectuez l'impression, remplacez les paramètres par leurs valeurs réelles afin que le SQL soit réexécutable?

J'ai joué avec la création d'une fonction ou deux pour accomplir quelque chose de similaire, mais avec des conversions de types de données, des problèmes de troncature de correspondance de motifs et des solutions non dynamiques. Je suis curieux de voir comment les autres développeurs résolvent ce problème sans imprimer manuellement chaque variable manuellement.

Réponses:


4

Une façon de faire cela est probablement quelque chose que vous avez déjà fait, et c'est de remplacer votre ligne:

if @DebugMode=1 print @SQL

avec

if @DebugMode=1 print @SQL + ' ' + convert(nvarchar(max), @Foobar)

Et vous devrez le faire de cette façon pour toutes vos variables, vous devrez les convertir manuellement pour éviter les erreurs de conversion.

Vous pouvez également utiliser RAISERROR d'une manière similaire:

if @DebugMode=1 RAISERROR (N'We used a value of %d for @Foobar', 10, 1, @Foobar)

HTH


Malheureusement, cela signifierait l'écriture manuelle de remplacements pour chaque variable utilisée dans l'instruction dynamique. Cela peut devenir compliqué lorsque plus de 20 variables sont utilisées et modifiées ou lorsque plusieurs instructions SQL dynamiques sont générées simultanément.
Brent D
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.