【问题标题】:Load SAS dataset into Teradata table using Fast LOAD使用 Fast LOAD 将 SAS 数据集加载到 Teradata 表中
【发布时间】:2013-03-21 06:24:22
【问题描述】:

我正在尝试使用 FASTLOAD 实用程序将 SAS 数据集加载到 teradata 表中。这在某些情况下可以正常工作,但我想分离错误表并在我自己/其他数据库中的 teradata 环境中创建它们。

有人可以为我提供语法(我知道,但它不起作用)如何使它成为可能?

任何方法都可以使用proc sql commandproc append command。提前致谢。

【问题讨论】:

  • 可以安全地假设您已尝试将日志表的备用数据库指定为表名的前缀,但没有成功?
  • 您好 Rob,是的,我一直在定义日志表,添加其他数据库名称作为前缀。你能告诉我如何解决这个问题吗?
  • 你能发布你尝试过的东西吗? (如果需要,重命名对象 - 语法很重要。)
  • Rob 谢谢你的回复。这是对我来说失败的语法 proc append base=tdserv.loadtest (TPT=YES FASTLOAD=YES TPT_ERROR_TABLE_1 = 'TPTLOAD.LOADTEST_ET' TPT_ERROR_TABLE_2 = 'TPTLOAD.LOADTEST_UV' TPT_LOG_TABLE = 'TPTLOAD.LOADTEST_RS') 数据=work.loaddata;运行;
  • Rob 谢谢你的回复。这是对我来说失败的语法,'tdserv' 是我的目标数据库,TPTLOAD 是我想在其中创建错误表的数据库。这是 LIBNAME TDServ TERADATA SERVER=TDServ USER=tduser PASSWORD=tdpasswd1 失败的语法; proc append base=tdserv.loadtest (TPT=YES FASTLOAD=YES TPT_ERROR_TABLE_1 = 'TPTLOAD.LOADTEST_ET' TPT_ERROR_TABLE_2 = 'TPTLOAD.LOADTEST_UV' TPT_LOG_TABLE = 'TPTLOAD.LOADTEST_RS') data=work.loaddata;运行;

标签: sas teradata


【解决方案1】:

您可以使用LOGDB libname 选项告诉 SAS 应该在哪个数据库中创建日志文件。默认情况下,它们与正在创建的表在同一个数据库中创建(命名为目标表,加上您发现的三个字符后缀)。使用您的 cmets 中提供的信息,试试这个:

/* Delete any exisiting log files for table TPT_LD_TEST */
libname TPTLOAD TERADATA 
                SERVER=TDServ DATABASE=TPTLOAD 
                USER=tduser PASSWORD=tdpasswd1
                ;
proc delete data=TPTLOAD.TPT_LD_TEST_ET;
run;
proc delete data=TPTLOAD.TPT_LD_TEST_UV;
run;
proc delete data=TPTLOAD.TPT_LD_TEST_RS;
run;
libname TPTLOAD clear;

/* Define connection to target database */
LIBNAME TDSERV  TERADATA 
                SERVER=TDServ 
                USER=tduser PASSWORD=tdpasswd1
                LOGDB=TPTLOAD;

/* Truncate target table if necessary */
proc sql noprint;
   delete from TDSERV.TPT_LD_TEST;
quit;

proc append base=TDSERV.TPT_LD_TEST(fastload=yes tpt=yes)
            data=work.FastLoad;
run;

我添加了一些代码来删除目标表中的任何现有行(FASTLOAD 的要求)。

如果您在目标数据库上拥有DROP TABLECREATE TABLE 权限,则删除并重新创建表可能更安全,这样您就可以保证结构并明确命名表索引。

/* Delete target table if it exists */
proc delete data=TDSERV.TPT_LD_TEST;
run;

data TDSERV.TPT_LD_TEST 
            (fastload=yes tpt=yes
             dbcreate_table_opts='primary index(index_column_name)'
            )
   set work.FastLoad;
run;

无论哪种情况,请务必从源数据集中删除所有重复记录;这些将被写入您的错误文件(以及任何未通过其他约束的记录)。

PROC DELETE 是一个方便的设备,因为它不会在目标表不存在时产生错误。

【讨论】:

  • 反响很好。谢谢。
  • 感谢您的回复 BellevueBob,您能告诉我如何在 libname 'TDSERV' 中查找我的目标表 'TPT_LD_TEST' 我们在哪里提到了架构/数据库名称以在我的目标数据库中查找表名.
  • 您在评论中发布的代码没有使用DATABASE= libname 选项,所以我也没有。如果未指定,将使用 Teradata 帐户配置文件中定义的“默认”数据库进行连接。 “最佳实践”是始终在 libname 语句中明确提供数据库名称。请注意,在 libname 语法中,SCHEMA=DATABASE= 的别名;我更喜欢DATABASE=,因为它更清楚地描述了你在做什么。
  • 但是当我使用这个代码 LIBNAME TDSERV TERADATA SERVER=TDServ USER=tduser PASSWORD=tdpasswd1 DATABASE=TGTLOAD LOGDB=TPTLOAD;但是错误表是在同一个 TGTLOAD 数据库而不是 TPTLOAD 数据库中创建的,我有点困惑,请您清除我。
  • 我得到的错误是我没有在 TGTLOAD 上创建表访问权限,我真的不想在 TGTLOAD 中创建我的错误表,因此使用 TPTLOAD 来放置我的错误表,但我继续失败。
猜你喜欢
  • 2020-01-21
  • 1970-01-01
  • 2014-08-31
  • 2010-11-10
  • 2014-03-30
  • 2017-07-01
  • 2016-02-05
  • 2015-03-20
  • 2017-12-17
相关资源
最近更新 更多