0

我可以从 U-SQL 中的参数化表值函数中进行选择,但我似乎无法在 CROSS APPLY 中使用它。请参阅@query1,我可以在其中从我的 TVF 中进行基本选择。请参阅@query3 了解我使用 SQL.MAP 的解决方法。请参阅@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 不同)目前不支持CROSS APPLY. 不幸的是,在这种情况下,错误消息完全具有误导性(我提交了一个错误以改进错误消息)。

CROSS APPLY目前只采用以下表达式之一

  1. EXPLODESqlArray在返回and的表达式(包括 C# UDF 调用)上 SqlMap(如您的解决方法)
  2. IApplierUDO的一个实例

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

于 2016-06-28T23:48:12.167 回答