Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Konvertieren Sie den CASE-Ausdruck in SQL in eine abgeleitete Spalte in SSIS

Die Moral der folgenden Geschichte lautet:Nur weil du kannst etwas in SSIS tun, das ist nicht immer eine gute Idee.

Ein typisches Beispiel ist diese Abfrage. Es wäre weitaus effizienter, die vorhandene SQL-Logik zu verwenden, um den endgültigen Wert zu generieren, als abgeleitete Spalten oder eine Skriptaufgabe in SSIS zu verwenden (ganz zu schweigen von der Verschwendung von Pipeline-Speicher, CPU usw.)

Quellabfrage

Ich habe Folgendes als Quellabfrage verwendet.

SELECT '50%' AS FixedARMRateReductionLimit, .1 AS PARAM_VAL_TXT
UNION ALL  SELECT 'Weekly PMMS Rate' AS FixedARMRateReductionLimit, .3 AS PARAM_VAL_TXT
UNION ALL  SELECT 'Frack',  .5

Prozentposition finden

Stellen Sie fest, ob in der Spalte ein Prozentzeichen vorhanden ist. Dadurch wird eine Spalte namens PercentPosition erstellt

FINDSTRING(FixedARMRateReductionLimit, "%",1)

Auf Preistext prüfen

Es sollte ausreichen, einen einfachen Vergleich durchzuführen, wie der erste Ausdruck zeigt, aber ich hatte Probleme damit. Ich nehme an, es ist eine String-Konvertierung/-Vergleich Ausgabe (siehe erste Anmerkung). Anstatt mich mit dem Abrufen eines booleschen Werts herumzuschlagen, habe ich findstring verwendet, um die Ordnungsposition zu generieren.

FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)

Ausgabe ableiten

Genießen Sie die doppelte Nutzung des ternären Operators .

(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100

Sie hätten einiges davon in einer Skriptaufgabe vereinfachen können, aber ich würde einfach die Logik in der Quelle übernehmen.