0

U-SQL でパラメーター化されたテーブル値関数から選択できますが、CROSS APPLY では使用できないようです。TVF から基本的な選択を行うことができる @query1 を参照してください。SQL.MAP を使用した回避策については、@query3 を参照してください。機能せず、コメントアウトされている @query2 を参照してください。これはサポートされているパターンですか? 返されるエラーは

「C# エラー CS0103: 名前 'temp' は現在のコンテキストに存在しません」.

DROP FUNCTION IF EXISTS dbo.fn_convert;

CREATE FUNCTION dbo.fn_convert(@temp decimal) /*temp in tenths of a degree Celsius */
RETURNS @result
AS
BEGIN
        @result =
        SELECT *
        FROM( VALUES
                 ("C", @temp / 10m) /* Celsius */
                ,("F", (@temp / 10m) * (9m / 5m) + 32m) /* Fahrenheit */
                ,("K", @temp / 10m + 273.15m) /* Kelvin */
            ) AS T([scale], [value]);
RETURN;
END;

@data =
    SELECT *
    FROM( VALUES
        (200), (220), (230)
    ) AS T(temp);

@query1 =
    SELECT *
    FROM dbo.fn_convert(200) AS f;

OUTPUT @query1
TO "/Output/test1_fn_convert.csv"
USING Outputters.Csv();

//doesn't work
//@query2 =
//    SELECT t.*
//    FROM @data
//    CROSS APPLY dbo.fn_convert(temp) AS t(scale, temp);
//
//OUTPUT @query2
//TO "/Output/test2_fn_convert.csv"
//USING Outputters.Csv();


@query3 =
    SELECT t.*
    FROM @data AS d
    CROSS APPLY EXPLODE(new SQL.MAP<string, decimal?>{{"C", d.temp / 10m}, {"F", (d.temp / 10m) * (9m / 5m) + 32m}}) AS t(scale, temp);

OUTPUT @query3
TO "/Output/test3_fn_convert.csv"
USING Outputters.Csv();
4

1 に答える 1

2

素晴らしいレプロをありがとう。

あなたが実行しているのは、U-SQL (T-SQL とは異なり) が現在 .NET で TVF をサポートしていないことですCROSS APPLY。残念ながら、この場合、エラー メッセージは完全に誤解を招くものです (エラー メッセージを改善するためにバグを報告しました)。

CROSS APPLY現在、次の式のいずれかのみを取ります

  1. EXPLODEどちらかを返す式 (C# UDF 呼び出しを含む) SqlArraySqlMap(回避策のように)
  2. IApplierUDOのインスタンス

http://aka.ms/adlfeedbackCROSS APPLYで、TVF をサポートするための要求を自由に追加してください。現時点でサポートされていない理由は、スケールアウト環境で任意の U-SQL 式に対して効率的に実装する複雑さに関係しています。CROSS APPLY

于 2016-06-28T23:48:12.167 に答える