2016-06-28 13 views
0

Я могу выбрать из параметризованной функции значения таблицы в U-SQL, но я не могу использовать ее в CROSS APPLY. См. @ Query1, где я могу сделать основной выбор из моего TVF. См. @ Query3 для моего обходного пути с использованием SQL.MAP. См. @ Query2, который не работает и закомментирован. Является ли это поддерживаемым шаблоном? Возвращаемая ошибка:Я могу SELECT из параметризованного TVF в U-SQL, но не могу CROSS APPLY

«Ошибка 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(); 

ответ

1

Благодарность за большой Repro.

Что вы используете, так это то, что U-SQL (в отличие от T-SQL) в настоящее время не поддерживает TVF в CROSS APPLY. К сожалению, сообщение об ошибке полностью вводит в заблуждение в этом случае (я подал ошибку, чтобы улучшить сообщение об ошибке).

CROSS APPLY в настоящее время занимает одно из следующих выражений

  1. EXPLODE на выражениях (включая C# UDF вызовов), которые возвращают либо SqlArray и SqlMap (как в вашем обходного)
  2. экземпляр IApplier UDO

Не стесняйтесь добавить запрос на поддержку ТВФ в CROSS APPLY - http://aka.ms/adlfeedback. Причина, по которой она не поддерживается в настоящий момент, связана со сложностью реализации CROSS APPLY против произвольных выражений U-SQL в эффективной среде масштабирования.

+0

Спасибо за быстрый ответ, Майкл! Я отправил запрос функции. – Jason

 Смежные вопросы

  • Нет связанных вопросов^_^