【问题标题】:Why different variable scope between parameter and input dataset variables?为什么参数和输入数据集变量之间的变量范围不同?
【发布时间】:2017-10-16 20:44:34
【问题描述】:

当使用sp_execute_external_script 从 SQL Server 2017 执行 Python 时,传入脚本的 SQL 参数在 Python 中成为全局变量,而输入数据集成为局部变量。

为什么范围不同?为什么不都成为局部变量或都成为全局变量?

EXEC sp_execute_external_script 
@language = N'python', 
@script = N'
print("Is InputDataSet global? " + str("InputDataSet" in globals()))
print("Is InputDataSet local? " + str("InputDataSet" in locals()))
print("Is i (passed in parameter) global? " + str("i" in globals()))
print("Is i (passed in parameter) local? " + str("i" in locals()))
',
@input_data_1 = N'select 1',
@params = N'@i INT',
@i = 10;

生产:

Is InputDataSet global? False
Is InputDataSet local? True
Is i (passed in parameter) global? True
Is i (passed in parameter) local? False

【问题讨论】:

    标签: python sql-server sql-server-2017


    【解决方案1】:

    从调用@script 一次处理整个输入结果集的上下文来看,变量范围的差异可能看起来很奇怪。

    但是,sp_execute_external_script 也可用于将结果流式传输到@script,以便一次处理一个块。在这种情况下,范围的差异是有道理的:

    • 每个输入数据集仅与@script 的当前调用相关,因此被放入一个局部变量中。
    • 参数应在脚本进程的生命周期内保留,因此应声明为全局参数(即,它们应设置一次,然后保留在内存中,直到处理完所有块并返回最终结果集)。

    背景

    在幕后,@script 的上下文在执行之前被注入到脚本模板中。据我所知,@script 中的代码成为每个需要处理的结果集块调用一次的方法的一部分。每次调用该方法时,在执行@script 中的代码之前,将使用输入结果集的当前块填充一个局部变量。

    【讨论】:

      猜你喜欢
      • 2021-04-29
      • 2013-11-04
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2014-01-31
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多