středa 8. prosince 2010

ODI a MS SQL datový typ VARCHAR(MAX)

Pro neznalé, MS SQL datový typ VARCHAR umožňuje rozsah 1-8000 bytů. Potřebujete-li větší, pak lze použít VARCHAR(MAX), který má rozsah až 2^31-1 bytů.

ODI a VARCHAR(MAX)
Pokud v ODI použijete reverse engineering pomocí JDBC driveru (je jedno zda jde o originální MS SQL driver com.microsoft.sqlserver.jdbc.SQLServerDriver nebo o DataDirect driver weblogic.jdbc.sqlserver.SQLServerDriver, který je součástí ODI 11g), pak z VARCHAR(MAX) se stane TEXT(2147483647) - bohužel to je špatně, protože při porovnávání sloupců s VARCHAR(MAX) a TEXT (např. během integrační fáze) dojde k chybě.

V případě, že využijete RKM MSSQL, které čte datové typy a jejich rozsah přímo z Data Dictionary MSSQL (pohled INFORMATION_SCHEMA.COLUMNS), pak nedojde k žádné konverzi a z VARCHAR(MAX) se stane VARCHAR(-1). Hodnota "-1" je uvedena pro rozsah "MAX" ve sloupci CHARACTER_MAXIMUM_LENGTH. Bohužel ani toto není správně, protože během integrační fáze dochází k vytvoření I$_ tabulky, která má stejnou strukturu jako cílová tabulka, ale ta je v ODI metadatech definovaná se sloupcem VARCHAR(-1). Výsledkem je, že tvorba pomocné tabulky spadne na chybu Incorrect syntax near ')', protože rozsah "-1" nelze použít.


Řešení pro ODI a VARCHAR(MAX)

Řešením je založení nového datové typu v ODI pro MS SQL a jednoduchá úprava RKM MSSQL.

Založení nového datového typu
V ODI Topologii pod technologií Microsoft SQL Server založte datový typ např. VARCHARMAX, uveďte Create Table Syntax a nezapomeňte vyplnit konverzi mezi ostatními používanými technologiemi.



Úprava RKM MSSQL
Z duplikujte originální RKM MSSQL ve kterém upravte krok 31 - Get Columns for Tables. Na záložce Command on Source změňte:
  • řádek col.DATA_TYPE DT_DRIVER,
  • na CASE col.DATA_TYPE + CAST(col.CHARACTER_MAXIMUM_LENGTH AS CHAR) When 'varchar-1' Then 'VARCHARMAX' Else col.DATA_TYPE End DT_DRIVER,

  • řádek ISNULL(col.CHARACTER_MAXIMUM_LENGTH,0) + ISNULL(col.NUMERIC_PRECISION_RADIX,0) LONGC,
  • na CASE col.DATA_TYPE + CAST(col.CHARACTER_MAXIMUM_LENGTH AS CHAR) When 'varchar-1' Then null Else ISNULL(col.CHARACTER_MAXIMUM_LENGTH,0) + ISNULL(col.NUMERIC_PRECISION_RADIX,0) End LONGC,


Pozor: MS SQL má ještě datové typy nvarchar(max) a varbinary(max). Pokud je používáte, pak je také do ODI zadefinujte a upravte RKM.


Erik Eckhardt

Žádné komentáře: