【问题标题】:Teradata - Running query passed as parameterTeradata - 作为参数传递的运行查询
【发布时间】:2018-08-10 10:36:52
【问题描述】:

我正在尝试学习 Teradata,并尝试简化我们将数据从生产数据库复制到测试数据库进行测试的方式。

对于这个过程,我们需要用以下详细信息填写 Excel 并发送到我们的 TDBA:-

  • 产品表 DbName
  • 产品表名称
  • 产品表 Perm_Size
  • 产品表 GB 大小
  • 产品表记录数
  • 过滤 SQL 查询以从 Prod DB 中获取数据
  • 过滤的记录数

我试图创建一个简单的 SQL 实用程序,它接受参数(上面列表中的斜体和粗体)并输出其余字段。

我开始了,但在创建和运行作为参数传递的查询时陷入了困境。我还尝试使用 '?dbName' 等参数在运行时接受值。但也无法解决这个问题。任何指导都会很棒。

WITH ParamInp(dbName, tblName, fltrQry) AS
(SELECT 'PRDDB', 'EMPL', 'SELECT * FROM PRDVIEWS.EMPL WHERE ID IN (1,2,3)') -- We have select access only on PRDVIEWS schema
SELECT 
    Upper(Trim(ParamInp.dbName)) AS DATABASENAME,
    Substr(Upper(Trim(ParamInp.dbName)), 1, Length(Trim(ParamInp.dbName))-2) || 'VIEWS' AS VIEWNAME, -- Creating View DB schema name
    Upper(Trim(ParamInp.tblName)) AS TABLENAME,
    fltrQry AS FILTER_QUERY,  -- do not want to execute fltrQry here. It is only to include in the excel
    Sum(currentperm) AS PERM_SIZE,
    Sum(currentperm)/1024**3 AS TOTAL_SIZE, -- GigaByte
    (SELECT Cast(Count(*) AS BIGINT) FROM (Substr(Upper(Trim(dbName)), 1, Length(Trim(dbName))-2) || 'VIEWS').Upper(Trim(tblName)) ) 
        AS TOTAL_COUNT,     -- Unable to get this working
    (SELECT Cast(Count(*) AS BIGINT) FROM (ParamInp.fltrQry)) 
        AS FILTERED_COUNT   -- This is where fltrQry should run
FROM dbc.allspace, ParamInp 
WHERE TABLENAME = ParamInp.tblName   
AND databasename = ParamInp.dbName   
GROUP BY 1,2,3
ORDER BY 1,2;

我想我无法在一个查询中完成。在那种情况下,我应该如何处理这个问题。我在 Teradata SQL 助手中运行查询,有时会获取要从生产中加载的表列表。

我希望输出为

DATABASENAME  | VIEWNAME  | TABLENAME  | FILTER_QUERY                       | PERM_SIZE  | TOTAL_SIZE  | TOTAL_COUNT  | FILTERED_COUNT  |
--------------------------------------------------------------------------------------------------------------------------
PRDDB         | PRDVIEWS  | EMPL       | SELECT * FROM PRDVIEWS.EMPL WHERE ID IN (1,2,3)  | 1111111    | 2.2         | 333333       | 444             |

【问题讨论】:

  • 您正在尝试将表名作为字符串参数传递,这是 DBMS 不允许的。您需要动态 SQL,它只能在存储过程中使用。

标签: sql teradata query-parameters named-parameters


【解决方案1】:

其他存储过程,您可以在 bteq 中使用两步方法来完成。

  1. 使用选择连接所需的 sql 命令,在需要的地方插入参数。 结果导出到文件中
  2. 从文件中运行这些创建的 sql 命令

我没有测试以下内容,它是为了展示大致的想法。 我确信需要进行一些额外的调整才能使生成的命令的语法正确。

.logon tdpid/user,pass
.set format off
.set titledashes off
.export file /tmp/myQuery.bteq
select 'SELECT 
    Upper(Trim('||dbName||')) AS DATABASENAME,
    Substr(Upper(Trim('||dbName||')), 1, Length(Trim('||dbName||'))-2) || 'VIEWS AS VIEWNAME,
    Upper(Trim('||tblName||')) AS TABLENAME,
    '||fltrQry||' AS FILTER_QUERY,
    Sum(currentperm) AS PERM_SIZE,
    Sum(currentperm)/1024**3 AS TOTAL_SIZE,
    (SELECT Cast(Count(*) AS BIGINT) FROM (Substr(Upper(Trim('||dbName||')), 1, Length(Trim('||dbName||'))-2) || 'VIEWS).Upper(Trim('||tblName||')) ) 
        AS TOTAL_COUNT,
    (SELECT Cast(Count(*) AS BIGINT) FROM ('||fltrQry||')) 
        AS FILTERED_COUNT 
FROM dbc.allspace 
WHERE TABLENAME = '||tblName||'   
AND databasename = '||dbName||'   
GROUP BY 1,2,3
ORDER BY 1,2;'  (TITLE '')
from (
SELECT 'PRDDB' as dbName, 'EMPL' as tblName, 'SELECT * FROM PRDVIEWS.EMPL WHERE ID IN (1,2,3)' as fltrQry
) as commands;
.export reset
.run file = /tmp/myQuery.bteq

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2021-11-15
    • 2021-09-21
    • 2020-04-06
    相关资源
    最近更新 更多