Создание макроса в Teradata SQL - PullRequest
0 голосов
/ 02 января 2019

Я создал макрос в Teradata SQL (я впервые это делаю).В прошлом я использовал SAS для макросов, так что вот где мой опыт.Но для этого проекта мне нужно использовать Teradata, и макрос действительно помог бы.

CREATE MACRO member_count(state CHAR(2)) AS
(
  Select
    ':state1' as state,
     other_vars, etc
  FROM database.:state_member;
);

EXEC member_count(NM);

То, что я мог бы предположить здесь, это то, что всякий раз, когда используется фраза ': состояние', которая вызывает буквы NMв код.Однако, когда я запускаю код, я получаю ошибку 3707: Синтаксическая ошибка, ожидается что-то вроде ключевого слова 'UDFCALLNAME' между '.'и ':'.

Возможен ли макрос для того, чего я хочу достичь?Если так, что мне нужно изменить?

1 Ответ

0 голосов
/ 02 января 2019

Поскольку вы хотите, чтобы вызывающий макрос говорил, из какой таблицы они будут выбирать, вы должны переключиться на динамически сгенерированный оператор SQL, что возможно только в процедуре.

Грубый набросок/ пример того, как это может выглядеть для вас:

CREATE PROCEDURE member_count(IN state CHAR(2))

--We have to tell it here that we will be returning a result set
DYNAMIC RESULT SETS 1

BEGIN
    --Declare variables we will be using at the top

    --One variable for the sql string
    DECLARE my_sql VARCHAR(500);

    --And another for the cursor that we will open for the result set
    DECLARE my_cursor CURSOR WITH RETURN ONLY FOR my_statement;

    --Now we build our dynamically generated sql statement
    --we use two single quotes together to escape the quote character
    --(essentially we want a single quote in the SQL statement so we must
    --double it as it's already inside single quotes).
    SET my_sql = 'Select
        ''' || state1 || ''' as state,
         other_vars, etc
      FROM database.' || state_member || ';';

    --Now we "prepare" the "statement" from our string
    PREPARE my_statement FROM my_sql;

    --and we open the cursor. We don't close it because we want it returned.
    OPEN my_cursor;
END

Это потребует некоторого всплеска и полировки, чтобы работать, поскольку здесь нет объявленной или заполненной переменной :state_member, но она не была вваша попытка макроса тоже, так что это, вероятно, выходит за рамки этого вопроса.

...