【问题标题】:Creating a Macro in Teradata SQL在 Teradata SQL 中创建宏
【发布时间】:2019-01-03 03:24:14
【问题描述】:

我在 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' 关键字的内容。和':'。

宏是否可以实现我想要完成的任务?如果是这样,我需要改变什么?

【问题讨论】:

  • 非常确定不能将变量/参数用作表或列名 (database.:state_member)。您正在尝试使用宏不支持的动态 SQL。您需要为此使用存储过程。
  • 您不能在此处使用变量作为对象名称(在此实例中是表,但也可以是数据库、列等)。您必须切换到使用存储过程,并且必须将动态生成的 SQL 设置为 varchar 变量,然后您必须打开从该动态 sql 生成的游标,以便可以将其返回给调用的用户程序。
  • 在创建宏或teradata程序之前,请检查您是否有创建权限。我没有看到任何我工作的地方有权为 SAS 程序员创建 Teradata SP 或宏。

标签: sql macros teradata


【解决方案1】:

因为您希望宏的调用者说出他们将从哪个表中选择,所以您必须切换到动态生成的 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 变量,但它也不在你的宏尝试中,所以这可能超出了这个问题的范围。

【讨论】:

  • 当我运行它时,它说在查询中找到导入样式参数。另外,代码的格式是否应该因为那些单引号而被关闭?当我将其用作常规声明时,我拥有的“粉红色”比我拥有的更多。这会影响功能吗?
  • 还有,为什么在 select 语句前要加单引号?
  • SELECT 语句前面的单引号是因为 SELECT 语句只是一个字符串。它只是一个包含该 SQL 语句的 VARCHAR(500) 变量。然后我们在随后的PREPAREOPEN 语句中执行存储在变量my_sql 中的字符串。这就是使它成为“动态”的原因,因为 Teradata 不知道它将在这里获取什么 SQL,因为它仅在执行过程时编写。至于您现在遇到的错误,请尝试将 IN 关键字放在您的 CREATE PROCEDURE 行中的变量名称 state 之前。我会更新的。
猜你喜欢
  • 2017-05-20
  • 2019-03-13
  • 2019-06-03
  • 2011-02-10
  • 1970-01-01
  • 2019-05-02
  • 2019-09-25
  • 2020-06-17
  • 1970-01-01
相关资源
最近更新 更多