2016-06-28 2 views
0

Je peux choisir parmi une fonction de valeur de tableau paramétrée en U-SQL, mais je ne peux pas l'utiliser dans une APPLICATION CROISEE. Voir @ query1 où je peux faire une sélection de base de mon TVF. Voir @ query3 pour ma solution de contournement en utilisant SQL.MAP. Voir @ query2 qui ne fonctionne pas et est mis en commentaire. Est-ce un modèle pris en charge? L'erreur renvoyée estJe peux SELECT à partir de TVF paramétré en U-SQL mais ne peut pas l'appliquer.

"Erreur C# CS0103: Le nom 'temp' n'existe pas dans le contexte actuel".

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

Répondre

1

Merci pour la grande repro.

Ce que vous rencontrez, c'est que U-SQL (contrairement à T-SQL) ne supporte actuellement pas les TVF dans CROSS APPLY. Malheureusement, le message d'erreur est complètement trompeur dans ce cas (j'ai déposé un bug pour améliorer le message d'erreur).

CROSS APPLY actuellement que prend l'une des expressions suivantes

  1. EXPLODE sur les expressions (y compris les appels C# UDF) qui renvoient soit SqlArray et SqlMap (comme dans votre solution de contournement)
  2. Une instance d'un IApplier UDO

N'hésitez pas à ajouter une demande pour soutenir TVFs dans CROSS APPLY à http://aka.ms/adlfeedback. La raison pour laquelle il n'est pas pris en charge pour le moment a trait à la complexité de l'implémentation de CROSS APPLY contre des expressions U-SQL arbitraires dans un environnement scale-out de manière efficace.

+0

Merci pour la réponse rapide, Michael! J'ai soumis la demande de fonctionnalité. – Jason