【问题标题】:Output scoped variable values within execution of batch/stored procedure TSQL在批处理/存储过程 SQL 的执行中输出作用域变量值
【发布时间】:2017-02-09 22:44:21
【问题描述】:

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

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

【问题讨论】:

  • AFAIK,这不能在 T-SQL 中完成。我很好奇如何在其他编程语言中一般地记录当前范围内的所有变量。

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


【解决方案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

【讨论】:

  • 谢谢 - 我不知道是否有一些隐藏的表格可以保留它们。 SQLCMD 是一个有趣的观点,感谢您的输入
  • Richard,不幸的是,由于上述原因,不能有表,因为这些是临时对象,仅在进程本身的范围内被激活。但是,您可以扫描 syscmets.text 并确定可能存在的变量,尽管这需要一定程度的编码来确保您既考虑每个变量并区分参数、表和变量以及它们的数据类型。
猜你喜欢
  • 2020-05-30
  • 2015-09-11
  • 2022-01-21
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多