Teradata BYTE to INTEGER at last!

23 abril \23\UTC 2018

Siempre ha sido un engorro transformar BYTES en ENTEROS en Teradata.

CAST() no lo permite, por lo que hay que buscarse soluciones más o menos ingeniosas, como hicimos aquí o aquí, o crearse una UDF. Lo dicho: un engorro.

Pero hete aquí que desde la versión Teradata 15.0 existe la función (escondida e indocumentada) ID2BIGINT().

Esta nueva función es utilizada para convertir los ID’s de los diferentes objetos del diccionario de datos definidos como BYTE (DatabaseId, TVMId…) a tipos enteros BIGINT. Por lo que parece, es una función interna de utilidad de Teradata, pero puede ser utilizada por el común de los mortales:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT DatabaseName, DatabaseId, ID2BIGINT(DatabaseId) FROM DBC.DBASE ORDER BY 1;


 *** Query completed. 30 rows found. 3 columns returned.
 *** Total elapsed time was 1 second.

DatabaseName     DatabaseId  ID2BIGINT(DatabaseId)
---------------  ----------  ---------------------
All              00000000                        0
CARLOS           00000304                      772
Crashdumps       0000EE03                    60931
DBC              00000100                      256
dbcmngr          0000FF03                    65283
Default          00000200                      512
External_AP      0000F703                    63235
EXTUSER          00000500                     1280
LockLogShredder  0000F603                    62979
PUBLIC           00000300                      768
SQLJ             0000F303                    62211
SysAdmin         0000ED03                    60675
SYSBAR           0000F503                    62723
SYSDBA           00000204                      516
SYSJDBC          0000FB03                    64259
SYSLIB           0000EA03                    59907
SYSSPATIAL       0000F103                    61699
SystemFe         0000EC03                    60419
SYSUDTLIB        0000F003                    61443
SYSUIF           0000FA03                    64003
Sys_Calendar     0000EF03                    61187
TDPUSER          0000EB03                    60163
TDQCD            0000F803                    63491
TDStats          0000F403                    62467
tdwm             0000FD03                    64771
TD_SERVER_DB     0000F903                    63747
TD_SYSFNLIB      0000E903                    59651
TD_SYSGPL        0000FC03                    64515
TD_SYSXML        0000F203                    61955
Viewpoint        00000404                     1028

Pero lo bueno es que no hay por qué limitarse a identificadores de objetos de la base de datos, sino que funciona con cualquier argumento BYTE:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT '0x00fabada', ID2BIGINT('00fabada'xB);


 *** Query completed. One row found. 2 columns returned.
 *** Total elapsed time was 1 second.

'0x00fabada'  ID2BIGINT('00FABADA'XB)
------------  -----------------------
0x00fabada                   16431834

Eso sí: si buscas en la documentación sólo encontrarás una oscura referencia como “reserved word”.

Word       Reserved
---------  --------
ID2BIGINT  X

Y tampoco hay noticias de ella en DBC.TVM ni en DBC.Functions.

Saludos.

Carlos.

Anuncios

RStudio RODBC on openSuSE 42.3

11 abril \11\UTC 2018

Después de pelearme bastante con RStudio, unixODBC y el Driver ODBC de Teradata, he conseguido por fin que todo funcione:

RStudio RODBC and Teradata

RStudio RODBC and Teradata

Saludos.

Carlos.