2017-09-26 2 views
1

MyFunction(long timestamp)メソッドを持つクラスMyClassYYYY-MM-DD HH24:mm:ssの形式の文字列として返される)を持つMyAssemblyというアセンブリがあるとします。私はこのような仕事のためのスクリプトを作成する場合:パラメータが同じ(行内)であっても、関数が複数回呼び出されますか?

@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 

を関数が複数回呼び出されるか、システムが十分に一度だけ、それを呼び出すと、他の列の戻り値を使用する「賢い」になりますか?いいえの場合は、どのようなオプションがありますか?

答えて

1

ADLAがあなたの状況を処理するのに十分なほど巧妙であるかどうかは分かりませんが、代わりにcustom processorを試してみてください。処理される行ごとにメソッドを1回実行します。

あなたのプロセスの方法は、このようにする必要があり

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(); 
関連する問題