2009-06-12 7 views
1

Existe-t-il un moyen d'exécuter une fonction scalaire à partir d'une transformation de colonne dérivée dans SSIS?Appel d'une fonction scalaire dans SSIS

-Scenario-

J'ai une fonction dans ma source DB qui convertit des poids sur la base d'une valeur UOM dans la colonne UOM de l'enregistrement. Je veux utiliser cette fonction dans le processus ETL pour assurer que mes mesures de poids sont toujours des livres. Puis-je appeler cette fonction depuis une colonne dérivée? Si ce n'est pas le cas, y a-t-il une autre tâche de transformation que je pourrais utiliser dans le flux de données (en essayant d'éviter les colonnes intermédiaires)?

dbo.Tasks tableau

id | Name | netWeight | grossWeight | UOM 
12 Task12  30000  50000  10 

dbo.MeasurementUnits tableau

id | Name | Shortname | Type | Precision 
12 Kilogram kg   3 10000  
14 Pound  lb   3 10000 

de fonction dbo.GetConvertedWeight

ALTER FUNCTION [dbo].[GetConvertedWeight](@iWeight money, @ifromUOM int, @iToUOM int) 
    RETURNS money 
    AS 
    BEGIN 
    DECLARE @lConvertedWeight money, 
      @lKgToGrams money, 
      @lLbToGrams money, 
      @lOzToGrams money, 
      @lWeightInGrams money 

    --convert the weight to grams first. 
    SELECT @lWeightInGrams = CASE WHEN @iFromUOM = 12 THEN (ISNULL(@iWeight,0) * 1000) 
         WHEN @iFromUOM = 14 THEN (ISNULL(@iWeight,0) * 453.5924) 
         WHEN @iFromUOM = 15 THEN (ISNULL(@iWeight,0) * 28.3495) 
         WHEN @iFromUOM = 13 THEN (ISNULL(@iWeight,0)) 
         ELSE ISNULL(@iWeight,0) 
         END 

    --Convert the converted weight to grams to the desired weight 
    SELECT @lConvertedWeight = CASE WHEN @iToUOM = 12 THEN (ISNULL(@lWeightInGrams,0)/1000) 
          WHEN @iToUOM = 13 THEN ISNULL(@lWeightInGrams,0) 
          WHEN @iToUOM = 14 THEN (ISNULL(@lWeightInGrams,0)/453.5924) 
          WHEN @iToUOM = 15 THEN (ISNULL(@lWeightInGrams,0)/28.3495) 
          ELSE (ISNULL(@lWeightInGrams,0)/453.5924) 
          END 
RETURN @lConvertedWeight 

Exemple fonction d'appel

dbo.GetConvertedWeight(dbo.Tasks.netWeight, dbo.Tasks.weightUOM, 14) AS netWeight 

Répondre

2

Non. Ce que vous voulez, c'est un OLE DB Command pour le faire. Envoyez les résultats à une colonne de sortie, et la vie devrait être passionnée pour vous - au moins en ce qui concerne SSIS.

+0

Après des heures de travail (et finalement de modifier cette fonction et de la transformer en procédure) j'ai finalement obtenu cette solution. Merci de m'avoir indiqué la bonne direction ;-) – rrydman