2

当使用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
4

1 回答 1

0

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

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

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

背景

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

于 2017-10-30T18:00:57.467 回答