2016-10-01 98 views
2

是否可以在存储过程的执行过程中输出所有当前变量值的列表?在批处理/存储过程的执行中输出范围变量值TSQL

对于上下文,当存储过程抛出错误以帮助解决问题时,很高兴知道什么变量值。当然,您可以手动将此日志记录与硬编码的变量值放在一个catch块中,但这并不干净或不可转移。

您不能使用sys.parameters(即使只是执行参数),因为动态SQL不起作用。是否有内置的变量或sys表格存储当前范围的变量,这些变量可以在执行过程中输出?

BEGIN TRY 
    DECLARE @Variable1 VARCHAR(64) = 'test' 
    -- Do stuff 
END TRY 
BEGIN CATCH 
    EXEC SpCustomLog @VariableValues = @Variable1 -- hardcoded 
    EXEC sp_execute 'SELECT @Variable1' -- not in scope/lost in build 
END CATCH 
+1

AFAIK,这不能在T-SQL中完成。我很好奇如何在其他编程语言中统一记录当前作用域中的所有变量。 –

回答

1

您正在使用局部变量,这是不可能将其从范围中取出。正如TechNet还提到:

一个变量的范围是Transact-SQL语句的是 可以参考变量的范围。变量的范围从 点开始一直持续到它声明的 中的批处理或存储过程结束。变量具有局部范围,并且在定义它们的批处理或过程内仅可见 。

但是你可以用SQLCMD,声明变量,它是可访问的出它的定义批太(!仅限于会话)

这里是代码:

--deifne a variable using SQLCMD mode 
:setvar myvar 10 
PRINT $(myvar)--accessible 

GO 

PRINT $(myvar)--Also accessible 

为了要激活SQLCMD模式,您需要从Query菜单中选择SQLCMD mode

+0

谢谢 - 我不知道是否有一些隐藏的桌子可能会持续他们。 SQLCMD是一个有趣的点,但是感谢您的输入 – Richard

+1

Richard,不幸的是,由于上述原因,不能有表格,因为这些临时对象仅在过程本身的范围内生效。但是,您可以扫描syscomments.text并确定可能的变量被调用,尽管这需要一定的编码级别来确保您对每个变量进行解释并区分参数,表和变量以及它们的数据类型。 – LogicalMan

相关问题