【发布时间】: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