Parámetros de impresión en SQL dinámico


9

He usado SQL dinámico para muchas tareas y continuamente me encuentro con el mismo problema: imprimir valores de variables usadas dentro de la instrucción Dynamic T-SQL.

P.EJ:

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

Los resultados de impresión del código anterior son simplemente "Seleccionar @Foobar". ¿Hay alguna forma de imprimir dinámicamente los valores y nombres de variables del sql que se está ejecutando? ¿O al hacer la impresión, reemplazar los parámetros con sus valores reales para que el SQL se pueda volver a ejecutar?

He jugado con la creación de una o dos funciones para lograr algo similar, pero con conversiones de tipos de datos, problemas de truncamiento de coincidencia de patrones y soluciones no dinámicas. Tengo curiosidad por saber cómo otros desarrolladores resuelven este problema sin imprimir manualmente todas y cada una de las variables manualmente.

Respuestas:


4

Probablemente, una forma de hacerlo es algo que ya haya hecho, y eso es reemplazar su línea:

if @DebugMode=1 print @SQL

con

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

Y tendría que hacerlo de esta manera para todas sus variables, deberá convertirlas manualmente para evitar errores de conversión.

También podría usar RAISERROR de manera similar:

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

HTH


Desafortunadamente, esto significaría escribir manualmente reemplazos para todas y cada una de las variables utilizadas en la declaración dinámica. Esto puede volverse difícil de manejar cuando se usan y cambian más de 20 variables o cuando se construyen múltiples sentencias sql dinámicas simultáneamente.
Brent D
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.