Betöltés közbeni adattípus konverziók problémái

Az adattárház betöltésének végén, - ha van rá lehetőségem, - üzletileg is ellenőrzöm a betöltött adatokat: megnézem például, hogy a könyvelési rendszer adott havi árbevétele egyezik-e az adattárház adott havi árbevételével, stb

Egyszerűbb esetben nem csinálok mást, min a forrásrendszer és az adattárház árbevételét is összesítem adott hóra. Ha stimmel nincs baj, ha nem, akkor valami megváltozott a forrásrendszerben vagy az árbevétel meghatározásának módjában…

Egy ilyen ellenőrzés során vettem észre, hogy néha egy-két euróval eltér a két rendszer havi szummája. Azaz a

Select Sum(EUR) from forrásrendszer

és a

Select Sum(EUR) from adattárház

lekérdezés eltérő eredményt adott. Pedig a betöltések során minden rekord csont nélkül átment a forrásrendszerből az adattárházba…

Az eltérés megértéséhez nézzük meg mit csinált az SSIS csomag.

Első lépésként meghatározta a forrásrendszer szummáját (Select Sum(EUR) from Forrásrendszer), és a lekérdezés eredményét kiírta egy táblába. És a hiba itt, egy ilyen egyszerű transzformáció során keletkezett:

  1. A forrásrendszer Sum(EUR) értékének beolvasása a Pipe line-ba (REAL adattipusból DT_R8 adattípusba)
  2. ...
  3. Sum összeg kiírása a táblába (DT_R4 adattipusból REAL adattipusba)

Implicit SSIS konverziók: DT_R8, DT_R4

 

Ha jól megnézi a transzformációt, láthatja, hogy a betöltő SSIS csomag 8 hosszú float-ból írt 4 hosszú float-ba, s ezzel a pipeline-on belül megváltoztatta az adat típusát (implicit konverzió).

Implicit egy konverzió, ha azt az SSIS maga hajtja végre (például smallint-ből int-be konvertál), és explicit, ha mi konvertáljuk át az adattípust pl: int-ről, varchar-ra a Data coversion task-kal

„A DT_R8-ból DT_R4-be történő implicit konverzió esetén előfordulhat, hogy az adat, betöltés közben nem szándékoltan, mindenféle figyelmeztető üzenet nélkül csonkolódik...” mondja az SQL Server 2005 Books online

És esetünkben pont ez történt. Az SSIS úgy gondolta, hogy egy float(4) oszlop szummájának eredményét már nem fogja tudni bepumpálni egy 4 hosszú float változóba, ezért azt 8 hosszúra változtatta, s így a transzformáció során olyan implicit konverziót hajtott végre, mely során az adat „nem szándékoltan” csonkolódott…

Felhasznált irodalom:

Kővári Attila - BI projekt

Új hozzászólás