【问题标题】:How to pass a parameter into a long query in Teradata如何将参数传递到 Teradata 中的长查询中
【发布时间】:2015-04-09 13:48:53
【问题描述】:

我有一个较大的查询(大约 8 个表被连接,大约 100 行 sql),我经常使用它来将许多不同的数据源连接在一起。我希望能够将参数传递到查询中,以便我自己和我团队的其他成员可以使用相同的代码库并只需更改我们正在查看的时间段。

示例代码(显然我的实际代码比这更多,但这些是我需要做的一些事情):

SELECT t1.* , x.col1, x.SUM_col3
FROM table1 t1
LEFT JOIN
(
    SELECT t2.col1, t3.col2, SUM(t3.col3) as SUM_col3
    FROM table2 t2
    INNER JOIN table3 t3
    ON t2.PI = t3.SI
    WHERE t3.col2 NOT LIKE :parameter1
    GROUP BY 1,2
    QUALIFY ROW_NUMBER() OVER(PARTITION BY t2.col1 ORDER BY t3.col1) = 1
) x
ON t1.col1 = x.col1
WHERE t1.START_DATE >= :parameter2

我考虑过的解决方案:

  1. 使用“?”前缀以便在运行时输入参数。我发现这种方法效率很低,因为输入的参数在运行代码后保留在代码中。
  2. 使用动态 SQL 创建一个随后可以调用的过程。我正在努力让这种方法发挥作用,因为它的预期目的似乎是相对较短的查询。

我怎样才能最好地构造我的查询和代码,以便能够以这样的方式运行 CALL MY_QUERY(:parameter1,:parameter2) 之类的东西,它要么在内存中创建结果表(不太推荐),要么返回一个然后我可以自己存储或使用的结果集(更优选)。

【问题讨论】:

  • 创建一个将您的输入作为参数的存储过程
  • 存储过程在这里有点矫枉过正,如果 OP 使用动态 sql,则会打开数据库进行 SQL 注入。宏允许视图接受参数,返回结果集,并消除 SQL 注入的风险。

标签: sql parameter-passing teradata


【解决方案1】:

您需要的是 Teradata 中的宏。宏几乎只是一个参数化视图,这正是您在这里所说的。

CREATE MACRO myMacro (parameter1 VARCHAR(20), parameter2 DATE)
AS
(
    SELECT t1.* 
    FROM table1 t1
    LEFT JOIN
    (
        SELECT t2.col1, t3.col2, SUM(t3.col3)
        FROM table2 t2
        INNER JOIN table3 t3
        WHERE t3.col2 NOT LIKE :parameter1
        GROUP BY 1,2
        QUALIFY ROW_NUMBER() OVER(PARTITION BY t2.col1 ORDER BY t3.col1) = 1
    ) x
    ON t1.col1 = x.col1
    WHERE t1.START_DATE >= :parameter2;
);

称呼它:

Execute myMacro('Harold', DATE '2015-01-01');

【讨论】:

  • 这看起来很完美。我知道我所描述的必须是某事的用例!
  • 最精彩的部分是你使用了正确的形式来表示带有前导分号的变量......就像你知道你在做什么一样。
  • 如何从宏的结果集中创建一个表?创建表测试为(执行 MyMacro(
  • 我认为,不幸的是,要将结果存储在表中,您需要一个存储过程。您应该能够使用相同的逻辑而不是动态(我认为)......
猜你喜欢
  • 2018-08-10
  • 2018-09-30
  • 2017-03-08
  • 1970-01-01
  • 2011-07-23
  • 2021-10-10
  • 2020-03-15
  • 1970-01-01
相关资源
最近更新 更多