在批处理/存储过程TSQL的执行中输出范围的变量值

时间:2016-10-01 13:11:49

标签: sql-server tsql stored-procedures dynamic scope

是否可以在执行存储过程中输出所有当前变量值的列表?

对于上下文,当存储过程抛出错误以帮助进行故障排除时,知道变量值是多么好。当然,您可以手动将带有硬编码变量值的日志记录放在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 个答案:

答案 0 :(得分:1)

您正在使用局部变量,这是不可能从它的范围内获取的。正如TechNet也提到过:

  

变量的范围是Transact-SQL语句的范围   可以引用变量。变量的范围从   指出它被声明直到批处理或存储过程结束   宣布它。变量具有局部范围,仅可见   在定义它们的批次或程序中。

但是您可以使用SQLCMD来声明变量,该变量也可以从定义的批处理中访问(仅限于会话!)

以下是代码:

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

GO

PRINT $(myvar)--Also accessible

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