我遇到了一个问题。 问题是我希望从Teradata获取所有表名和行数。
我有这个查询,它给了我一个特定模式的所有视图名称。
I] SELECT TableName FROM dbc.tables WHERE tablekind='V' AND databasename='SCHEMA' order by TableName;
&安培;我有这个查询,它给出了Schema中特定表/视图的行数。
II] SELECT COUNT(*) as RowsNum FROM SCHEMA.TABLE_NAME;
现在,任何人都可以告诉我如何从查询I (TableName)
获取结果并将其放入QUERY II (TABLE_NAME)
您将获得帮助。
提前致谢,
Vrinda
答案 0 :(得分:1)
这是一个从数据库中的所有表中收集行数的SP,它非常基本,没有错误检查等。
它使用dbc.SysExecSQL或EXECUTE IMMEDIATE显示游标和动态SQL:
CREATE SET TABLE RowCounts
(
DatabaseName VARCHAR(30) CHARACTER SET LATIN NOT CASESPECIFIC,
TableName VARCHAR(30) CHARACTER SET LATIN NOT CASESPECIFIC,
RowCount BIGINT,
COllectTimeStamp TIMESTAMP(2))
PRIMARY INDEX ( DatabaseName ,TableName )
;
REPLACE PROCEDURE GetRowCounts(IN DBName VARCHAR(30))
BEGIN
DECLARE SqlTxt VARCHAR(500);
FOR cur AS
SELECT
TRIM(DatabaseName) AS DBName,
TRIM(TableName) AS TabName
FROM dbc.Tables
WHERE DatabaseName = :DBName
AND TableKind = 'T'
DO
SET SqlTxt =
'INSERT INTO RowCounts ' ||
'SELECT ' ||
'''' || cur.DBName || '''' || ',' ||
'''' || cur.TabName || '''' || ',' ||
'CAST(COUNT(*) AS BIGINT)' || ',' ||
'CURRENT_TIMESTAMP(2) ' ||
'FROM ' || cur.DBName ||
'.' || cur.TabName || ';';
--CALL dbc.sysexecsql(:SqlTxt);
EXECUTE IMMEDIATE sqlTxt;
END FOR;
END;
如果您无法创建表或SP,则可以使用VOLATILE TABLE(如DrBailey建议的那样)并运行以下查询返回的INSERT:
SELECT
'INSERT INTO RowCounts ' ||
'SELECT ' ||
'''' || DatabaseName || '''' || ',' ||
'''' || TableName || '''' || ',' ||
'CAST(COUNT(*) AS BIGINT)' || ',' ||
'CURRENT_TIMESTAMP(2) ' ||
'FROM ' || DatabaseName ||
'.' || TableName || ';'
FROM dbc.tablesV
WHERE tablekind='V'
AND databasename='schema'
ORDER BY TableName;
但是你的系统上可能已经存在这样的例程,你可能会问你DBA。如果它不必100%准确,则此信息也可能从收集的统计信息中提取。
答案 1 :(得分:1)
使用dnoeth的答案,但使用create“create volatile table”,这将使用您的假脱机创建表,并在会话关闭时删除所有数据。 您无需使用易失性表格的写入权限。
答案 2 :(得分:0)
有什么方法可以不使用count()从系统表中查找表/视图的行数。 Count()花了很长时间才争夺大桌。 dbc.statsv视图仅包含表,因为我们无法收集视图的统计信息。