即使参数相同(连续),函数也会被多次调用吗?

Will a function be called multiple times even if the parameter is the same (in a row)?

假设我有一个名为 MyAssembly 的程序集,其中 class MyClass 有一个 MyFunction(long timestamp) 方法(它 return 将日期时间作为格式的字符串:YYYY-MM-DD HH24:mm:ss)。如果我为这样的工作创建脚本:

@outputData =
SELECT MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(0,4) AS Year
      ,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Month
      ,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Day
      ,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Hour
      ,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Minute
      ,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Second
 FROM @queryInput AS t1

该函数会被多次调用,还是系统 "clever" 足以只调用一次并为其他列使用 return 值?如果不是,我有什么选择?

我不确定 ADLA "clever" 是否足以处理您的情况,但您可以尝试使用 custom processor。它会为处理的每一行执行一次您的方法。

你的 Process 方法应该是这样的:

public override IRow Process(IRow input, IUpdatableRow output)
{
     string timestamp = input.Get<string>("timestamp");
     var myFunctionResult = MyAssembly.MyClass.MyFunction(timestamp);

     output.Set<string>("Year", myFunctionResult.Substring(0,4));
     output.Set<string>("Month", myFunctionResult.Substring(...));
     //do this for other fields
     return output.AsReadOnly();
}

在 USQL 中你的调用应该是这样的:

@outputData = 
    PROCESS @queryInput
    PRODUCE Year string,
         Month string,
         ...
    REQUIRED timestamp
    USING new MyAssembly.MyProcessor();