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
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