在DB2/400 SQL查询中动态引用表名。。?

在DB2/400 SQL查询中动态引用表名。。?,db2,db2-400,db2-luw,Db2,Db2 400,Db2 Luw,我想运行一个查询,为定期更改的表名列表获取实时数据和元数据的组合。这是一个大型服务器上的研究和分析,每个服务器上有100多个模式和数千个表/视图。我需要帮助动态引用表名,我知道这是不可能的。然而 我的谷歌搜索表明解决方案可能是文本变量中的SQL语句,然后由EXEC语句执行。但这是DB2/400V7R3,这是一件复杂的事情(就像它在IBM网站上的SQL引用一样),我很难创建正确的语法 下面是我希望做的一个基本示例,但它当然不起作用: SELECT TABLE_NAME,

我想运行一个查询,为定期更改的表名列表获取实时数据和元数据的组合。这是一个大型服务器上的研究和分析,每个服务器上有100多个模式和数千个表/视图。我需要帮助动态引用表名,我知道这是不可能的。然而

我的谷歌搜索表明解决方案可能是文本变量中的SQL语句,然后由EXEC语句执行。但这是DB2/400V7R3,这是一件复杂的事情(就像它在IBM网站上的SQL引用一样),我很难创建正确的语法

下面是我希望做的一个基本示例,但它当然不起作用:

SELECT        TABLE_NAME,
              TABLE_TEXT,
              ( SELECT COUNT(*) FROM TABLE_NAME ) AS ROW_COUNT
              -- above line of course does not work
FROM          QSYS2.SYSTABLES
WHERE         TABLE_SCHEMA = 'ABCDEFGH'
AND           TABLE_NAME IN ('ARCMNTST', 'ARIMSGT', 'ARTENT', 'DAILYHT', 'ETC')
我知道我需要以下内容,但我无法找出正确的陈述:

DECLARE       @sqltext AS VARCHAR(128)
SELECT        TABLE_NAME,
              TABLE_TEXT,
              ( SET @sqltext = 'SELECT COUNT(*) FROM ABCDEFGH.' || TABLE_NAME
                EXEC sqltest ) AS ROW_COUNT --this is probably wrong
FROM          QSYS2.SYSTABLES
WHERE         TABLE_SCHEMA = 'ABCDEFGH'
AND           TABLE_NAME IN ('ARCMNTST', 'ARIMSGT', 'ARTENT', 'ETC', 'ETC', 'ETC')
ORDER BY      TABLE_NAME

动态SQL并不难

基本上,将SQL语句构建到字符串变量中。使用
CONCAT
包含来自其他

@sqlStmt = 'Insert into mytable values (''ConstVal'',' concat SomeVar concat ')';

execute immediate @sqlStmt;
问题是您必须转义字符串,如上面带有双单引号的“consval”

另一个问题是,您不能像试图使用的那样使用
SELECT
。如果只返回一行,
selectinto
将是静态语句的一个选项。但不支持动态。您必须使用动态
值转换为

但是,您似乎希望返回多行。在这种情况下,您需要使用光标。不幸的是,动态游标有点复杂,因为您必须使用SQL描述符

declare myCursor cursor for myStatement;

set @sqlStmt = 'select ....';
prepare myStatement into mySqlDescriptor from @SqlStmt;

open myCursor;
// done if you are returning the results
// assuming you want to process in your procedure..
// add a loop that does 
//   fetch next from myCursor into myData;
话虽如此,您不需要任何数据来获取表的行数……syspartitionstat目录视图已经有了这些信息

select table_name, number_rows 
from syspartitionstat
where table_schema = 'ABCDEFGH' 
      and TABLE_NAME in ('ARCMNTST', 'ARIMSGT', 'ARTENT', 'ETC', 'ETC', 'ETC');

动态SQL并不难

基本上,将SQL语句构建到字符串变量中。使用
CONCAT
包含来自其他

@sqlStmt = 'Insert into mytable values (''ConstVal'',' concat SomeVar concat ')';

execute immediate @sqlStmt;
问题是您必须转义字符串,如上面带有双单引号的“consval”

另一个问题是,您不能像试图使用的那样使用
SELECT
。如果只返回一行,
selectinto
将是静态语句的一个选项。但不支持动态。您必须使用动态
值转换为

但是,您似乎希望返回多行。在这种情况下,您需要使用光标。不幸的是,动态游标有点复杂,因为您必须使用SQL描述符

declare myCursor cursor for myStatement;

set @sqlStmt = 'select ....';
prepare myStatement into mySqlDescriptor from @SqlStmt;

open myCursor;
// done if you are returning the results
// assuming you want to process in your procedure..
// add a loop that does 
//   fetch next from myCursor into myData;
话虽如此,您不需要任何数据来获取表的行数……syspartitionstat目录视图已经有了这些信息

select table_name, number_rows 
from syspartitionstat
where table_schema = 'ABCDEFGH' 
      and TABLE_NAME in ('ARCMNTST', 'ARIMSGT', 'ARTENT', 'ETC', 'ETC', 'ETC');