#teradata #ddl
Вопрос:
Что я хочу сделать, так это проверить в своей базе данных, существует ли моя таблица, если да, удалите ее. Вот мой .tpt :
DEFINE JOB DELETE_ET_TABLES
DESCRIPTION 'Delete ET tables'
(
DEFINE OPERATOR DDL_OPERATOR
DESCRIPTION 'Teradata Parallel Transporter DDL Operator'
TYPE DDL
ATTRIBUTES
(
varchar TdpId = @TERADATA_TDP,
varchar UserName = @User,
varchar UserPassword = @Pwd
);
APPLY
'SELECT (CASE WHEN TableName = ''Test_Del''
THEN (''DROP TABLE @Table;'')
ELSE NULL
END)
FROM dbc.TablesV WHERE databasename = @Db;' TO OPERATOR(DDL_OPERATOR);
И это сообщение об ошибке, которое я получаю :
Running "tbuild" command: tbuild -f /$HOME/loaders/test_deleteETTables.tpt -u TERADATA_TDP=$TDP, TERADATA_DATABASE=$DB -L /$LOG/
Teradata Parallel Transporter Version 16.20.00.09 64-Bit
TPT_INFRA: Syntax error at or near line 18 of Job Script File '/$HOME/loaders/test_deleteETTables.tpt':
TPT_INFRA: At "(" missing { EXTENDED_LITERAL_ CHAR_STRING_LITERAL_ } in Rule: Character String Literal
Compilation failed due to errors. Execution Plan was not generated.
У тебя есть какие-нибудь идеи ? Я пробовал несколько вещей, таких как :
SELECT 1 FROM dbc.TablesV WHERE databasename = @Db AND TABLENAME ='TEST_DEL';
CASE WHEN ACTIVITYCOUNT = 1
THEN (DROP TABLE @Table)
ELSE ( QUIT )
END;
Все мои переменные были объявлены. Я чувствую, что это проблема с использованием одинарных кавычек внутри утверждения que, но я не уверен и не знаю, как ее решить. Большое вам спасибо за потраченное время.
Комментарии:
1. Есть ли у ваших символьных переменных, таких как @db, одинарные кавычки?
2.Я думаю, что это связано с использованием NULL, но
SELECT
недопустимо для оператора DDL. Рекомендуемый способ сделать это-просто передать aDROP
оператору и сказать ему игнорировать «не найдено» (и считать это успешным), т. е.ErrorList='3807'
3. Спасибо вам обоим за ваши ответы ! Действительно, Фред, это то, что я, наконец, решил сделать, я думал об этом в самом начале, но хотел более «правильного» решения. В итоге все получилось нормально. Знаете ли вы, может ли работать работа с двумя разными DDL (один для выбора и один для удаления)? Еще раз благодарю вас за потраченное время
4. Нет, даже если бы вы использовали другой оператор для ВЫБОРА, вы не смогли бы условно сгенерировать / выполнить УДАЛЕНИЕ в одном и том же задании TPT. У вас может быть несколько заданий TPT плюс несколько сценариев «оболочки» вокруг них или BTEQ для условного выполнения, за которым следует задание TPT.
Ответ №1:
Решение, которое Фред рекомендовал мне попробовать в комментариях, сработало просто отлично :
Я думаю, что это связано с использованием NULL, но SELECT недопустим для оператора DDL. Рекомендуемый способ сделать это-просто передать сообщение оператору и попросить его игнорировать «не найдено» (и считать это успешным), т. е. errorList=’3807′
DESCRIPTION 'Delete ET tables'
(
DEFINE OPERATOR DDL_OPERATOR
DESCRIPTION 'Teradata Parallel Transporter DDL Operator'
TYPE DDL
ATTRIBUTES
(
varchar TdpId = @TERADATA_TDP,
varchar UserName = @USERDB,
varchar UserPassword = @PWD,
VARCHAR ErrorList = '3807'
);
APPLY
('DROP TABLE @TABLENAME')
TO OPERATOR(DDL_OPERATOR);
);```