在动态SQL中打印参数


9

我已经将动态SQL用于许多任务,并不断遇到相同的问题:打印在动态T-SQL语句中使用的变量的值。

例如:

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

上面代码的打印结果只是“选择@Foobar”。有什么方法可以动态打印正在执行的sql的值和变量名?还是在执行打印时,将参数替换为其实际值,以便SQL可重新运行?

我玩过创建一个或两个函数来完成相似的工作,但是却涉及数据类型转换,模式匹配截断问题和非动态解决方案。我很好奇其他开发人员如何在不手动打印每个变量的情况下解决此问题。

Answers:


4

完成此操作的一种方法可能是已经完成的事情,那就是替换行:

if @DebugMode=1 print @SQL

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

而且,您必须对所有变量使用这种方式,因此需要手动对其进行转换,以避免转换错误。

您也可以类似的方式使用RAISERROR:

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

HTH


不幸的是,这将意味着为动态语句中使用的每个变量手动编写替换。当使用和更改20个以上的变量或同时构建多个动态sql语句时,这可能变得很笨拙。
布伦特D
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.