我可以从 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
目前只接受以下表达式之一
EXPLODE
表达式(包括 C# UDF 调用)return
SqlArray
和 SqlMap
(如您的解决方法)
- 一个实例
IApplier
UDO
随时在 http://aka.ms/adlfeedback 中添加支持 TVF 的请求以支持 CROSS APPLY
。目前不支持它的原因与在横向扩展环境中有效地针对任意 U-SQL 表达式实施 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
目前只接受以下表达式之一
EXPLODE
表达式(包括 C# UDF 调用)returnSqlArray
和SqlMap
(如您的解决方法)- 一个实例
IApplier
UDO
随时在 http://aka.ms/adlfeedback 中添加支持 TVF 的请求以支持 CROSS APPLY
。目前不支持它的原因与在横向扩展环境中有效地针对任意 U-SQL 表达式实施 CROSS APPLY
的复杂性有关。