使用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
答案 0 :(得分:0)
从一次调用@script
的上下文查看一次处理整个输入结果集时,变量范围的差异可能看起来很奇怪。
但是,sp_execute_external_script
也可用于将结果流式传输到@script
,以便一次处理一个块。在这种情况下,范围的差异是有道理的:
@script
的当前调用相关,因此将其放入局部变量中。 在幕后,@script
的上下文在执行之前被注入脚本模板。据我所知,@script
中的代码成为每个需要处理的结果集块调用一次的方法的一部分。每次调用该方法时,在执行@script
中的代码之前,将使用输入结果集的当前块填充局部变量。