我可以从 U-SQL 中的参数化 TVF SELECT 但不能交叉应用

I can SELECT from parameterized TVF in U-SQL but cannot CROSS APPLY

我可以 select 来自 U-SQL 中的参数化 Table 值函数,但我似乎无法在 CROSS APPLY 中使用它。请参阅 @query1,在那里我可以从我的 TVF 中执行基本的 select。有关我使用 SQL.MAP 的解决方法,请参阅 @query3。请参阅 @query2,它不起作用并且被注释掉了。这是受支持的模式吗?返回的错误是

"C# error CS0103: The name 'temp' does not exist in the current context".

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();

感谢伟大的复刻。

您 运行 喜欢的是 U-SQL(与 T-SQL 不同)目前不支持 CROSS APPLY 中的 TVF。不幸的是,在这种情况下,错误消息完全具有误导性(我提交了一个错误以改进错误消息)。

CROSS APPLY 目前只接受以下表达式之一

  1. EXPLODE 表达式(包括 C# UDF 调用)return SqlArraySqlMap(如您的解决方法)
  2. 一个实例 IApplier UDO

随时在 http://aka.ms/adlfeedback 中添加支持 TVF 的请求以支持 CROSS APPLY。目前不支持它的原因与在横向扩展环境中有效地针对任意 U-SQL 表达式实施 CROSS APPLY 的复杂性有关。