web-dev-qa-db-fra.com

Paramètres d'impression dans Dynamic SQL

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

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". Y a-t-il un moyen d'imprimer de manière dynamique les valeurs et les noms de variables du SQL exécuté? Ou lorsque vous faites l'impression, remplacez les paramètres par leurs valeurs réelles afin que le SQL soit re-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 type de données, des problèmes de troncature correspondant aux modèles et des solutions non dynamiques. Je suis curieux de savoir comment les autres développeurs résolvent ce problème sans imprimer manuellement chaque variable manuellement.

9
Brent D

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

if @DebugMode=1 print @SQL

avec

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

Et vous devriez 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 de la même manière:

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

Ht

4
SQLRockstar