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