2013-03-30 6 views
2

Я пытаюсь загрузить набор данных SAS в таблицу Teradata с помощью утилиты FASTLOAD. В некоторых случаях это прекрасно работает, но я хочу отделить таблицы ошибок и создать их в своей собственной/другой базе данных в среде teradata.Загрузите набор данных SAS в таблицу Teradata, используя Fast LOAD

Может ли кто-нибудь предоставить мне синтаксис (я знаю, но это не работает), как это сделать?

Любой метод может быть использован либо с использованием proc sql command, либо proc append command. Заранее спасибо.

+0

Можно ли предположить, что вы попытались указать свою альтернативную базу данных для таблиц журналов в качестве префикса для имени таблицы и что это не сработало? –

+0

Привет, Роб, да, я определял таблицы журналов, добавляя другое имя базы данных в качестве префикса. не могли бы вы дать мне знать, как решить эту проблему. – lucky

+0

Можете ли вы опубликовать то, что вы пробовали, и не работает? (Переименуйте объекты, если вам нужно - синтаксис - это то, что важно.) –

ответ

2

Вы можете использовать опцию libname LOGDB, чтобы сообщить SAS, в базу данных которой должны быть созданы файлы журналов. По умолчанию они создаются в той же базе данных, что и создаваемая таблица (называемая целевой таблицей плюс три символьных суффикса, которые вы обнаружили). Используя информацию, представленную в комментариях, попробуйте следующее:

/* 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).

Если у вас есть и CREATE 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 - удобное устройство, потому что оно не создаст ошибку, если целевая таблица не существует.

+0

Отличный ответ. Спасибо. –

+0

Спасибо за ваш ответ BellevueBob, Не могли бы вы рассказать мне, как моя целевая таблица «TPT_LD_TEST» просматривается в libname «TDSERV», где мы упомянули имя схемы/databasename для поиска имени таблицы в моей целевой базе данных. – lucky

+0

Код, который вы опубликовали в своем комментарии, не использовал параметр 'DATABASE =' libname, поэтому я тоже этого не сделал. Если не указано, соединение будет выполнено с использованием базы данных по умолчанию, определенной в профиле вашей учетной записи Teradata. «Лучшая практика» заключалась бы в том, чтобы всегда явно указывать имя базы данных в выражении libname. Обратите внимание, что в синтаксисе libname 'SCHEMA =' является псевдонимом для 'DATABASE ='; Я предпочитаю 'DATABASE =', потому что он более четко описывает, что вы делаете. – BellevueBob

Смежные вопросы