Import 如何使用BTEQ导入将数据从分隔文件导入teradata表?

Import 如何使用BTEQ导入将数据从分隔文件导入teradata表?,import,teradata,Import,Teradata,我试图在linux环境下执行以下bteq命令,但无法将数据正确加载到Teradata DB服务器。有人可以建议我解决以下问题,我面临的加载 使用的BTEQ命令: .SET width 64000; .SET session transaction btet; .logmech ldap .logon XXXXXXX/XXXXXXXX,********; DATABASE corecm; .PACK 1000 .IMPORT VARTEXT '~' FILE=/v/global/user/ap

我试图在linux环境下执行以下bteq命令,但无法将数据正确加载到Teradata DB服务器。有人可以建议我解决以下问题,我面临的加载

使用的BTEQ命令:

.SET width 64000;
.SET session transaction btet;
.logmech ldap
.logon XXXXXXX/XXXXXXXX,********;

DATABASE corecm;

.PACK 1000
.IMPORT VARTEXT '~' FILE=/v/global/user/application_event_bus_evt
.REPEAT *
USING(APPLICATION_EVENT_ID CHAR(24),BUS_EVT_ID CHAR(24),BUS_EVT_VID BIGINT,BUS_EVT_RESTATE_IN SMALLINT)

insert into corecm.application_event_bus_evt (APPLICATION_EVENT_ID
, BUS_EVT_ID
, BUS_EVT_VID
, BUS_EVT_RESTATE_IN
)
values
( COALESCE(:APPLICATION_EVENT_ID,1)
, COALESCE(:BUS_EVT_ID,1)
, COALESCE(:BUS_EVT_VID,1)
, COALESCE(:BUS_EVT_RESTATE_IN,1)
) ;
.LOGOFF;
.EXIT;
示例输入文件定界符“~”[/v/global/user/application\u event\u bus\u evt]:

Ckn3gMxLEeOgIQBQVgErYA==~g+GDDtlaY3n7BdUrYshDFA==~1~1
CL1kEcxLEeOgIQBQVgErYA==~qoKoiuGDbClpcGt/z6RKGw==~1~1
oYIVcMxKEeOgIQBQVgErYA==~mfmQiwl7yAteevzJfilMvA==~1~1
5N7ME5bM4xGhM7exj3ykUw==~yFM2FZbM4xGhM7exj3ykUw==~1~0
JLBH4JfM4xGDH9s5+Ds/8w==~doZ/7pfM4xGDH9s5+Ds/8w==~1~0
fGvpoMxKEeOgIQBQVgErYA==~mQUQIK2mY6WIPcszfp5BTQ==~1~1
表定义:

CREATE MULTISET TABLE CORECM.APPLICATION_EVENT_BUS_EVT ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      APPLICATION_EVENT_ID CHAR(26) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      BUS_EVT_ID CHAR(26) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      BUS_EVT_VID BIGINT NOT NULL,
      BUS_EVT_RESTATE_IN SMALLINT)
UNIQUE PRIMARY INDEX ( APPLICATION_EVENT_ID ,BUS_EVT_ID ,BUS_EVT_VID )
INDEX APPLICATION_EVENT_BUS_EVT_IDX1 ( APPLICATION_EVENT_ID )
INDEX APPLICATION_EVENT_BUS_EVT_IDX2 ( BUS_EVT_ID ,BUS_EVT_VID );
结果在数据库服务器中设置为

    APPLICATION_EVENT_ID        BUS_EVT_ID                  BUS_EVT_VID             BUS_EVT_RESTATE_IN 

1    Ckn3gMxLEeOgIQBQVgErYA     == g+GDDtlaY3n7BdUrYshD     85,849,873,219,141,958  12,544
2    CL1kEcxLEeOgIQBQVgErYA     == qoKoiuGDbClpcGt/z6RK     85,849,873,219,155,783  12,544
3    oYIVcMxKEeOgIQBQVgErYA     == mfmQiwl7yAteevzJfilM     85,849,873,219,142,006  12,544
4    5N7ME5bM4xGhM7exj3ykUw     == JAf0GpbM4xGhM7exj3yk     85,849,873,219,155,797  12,288
5    JLBH4JfM4xGDH9s5+Ds/8w     == Du6T7pfM4xGDH9s5+Ds/     85,849,873,219,155,768  12,288
6    fGvpoMxKEeOgIQBQVgErYA     == mQUQIK2mY6WIPcszfp5B     85,849,873,219,146,068  12,544
如果我们看看数据,我们可以看到两个问题

  • 前两列数据长度为24个字符(根据输入文件),但问题是它在下一列中移动了两个字符

  • 中的列
    BUS_EVT_VID
    BUS_EVT_repreat_分别有错误的数据85849873219141958和12544,而不是1和1(这可能是因为前两列数据发生了移位)

  • 我尝试了以下选项来解决上述问题,但无法解决该问题

  • 修改了表定义,即将数据类型更改为 字符(28),字符(24),字符(26)
  • 修改了表定义列 VARCHAR(24)和VARCHAR(26)的数据类型
  • 修改了BTEQ命令,即在下面的行中更改了数据类型, 使用(应用程序事件ID字符(24)、总线EVT ID字符(24)、总线EVT VID BIGINT、总线EVT重申SMALLINT)

  • 提前感谢。

    当您定义VARTEXT时,所有输入列都必须定义为VARCHAR,但您使用了CHAR和INT

    根据目标表的定义,VARCHAR length应该可以工作:

    USING(
          APPLICATION_EVENT_ID VARCHAR(26),
          BUS_EVT_ID           VARCHAR(26),
          BUS_EVT_VID          VARCHAR(19),
          BUS_EVT_RESTATE_IN   VARCHAR(6)
         )
    

    非常感谢您的反馈。我已成功将数据加载到TD服务器。:)你能给我提供数据类型到VARCHAR大小的转换吗,比如BIGINT->VARCHAR(19),SMALLINT->VARCHAR(6)?我是否应该假设数据类型获取的每个数据字节都是VARCHAR大小?请注意。它不是数据类型的内部大小,而是作为字符串的外部表示形式,例如,SMALLINT可以存储-32768和+32767之间的值,内部为两个字节,但5位数字加上前导符号为VARCHAR。十进制数(n,m)->n位加逗号加符号=VARCHAR(n+2)