我想比较数据库之间给定模式中每个视图的记录数:DEV 和 PROD。目标是验证相应的视图(DEV 和 PROD 中)是否具有相同的记录数。
假设我们有这样的东西:
数据库_DEV.Schema.View01
数据库_DEV.Schema.View02
数据库_DEV.Schema.View03
和
数据库_PROD.Schema.View01
Database_PROD.Schema.View02
数据库_PROD.Schema.View03
因此我想要一张像这样的表格:
视图名称 | 数据库_DEV | 数据库_产品 |
---|---|---|
查看01 | 345 | 345 |
查看02 | 450 | 450 |
查看03 | 555 | 666 |
视图名称应从 INFORMATION_SCHEMA 表动态获取:
SELECT TABLE_NAME
FROM Database_PROD.INFORMATION_SCHEMA.TABLES
WHERE 1=1
AND TABLE_CATALOG = 'Database_PROD'
AND TABLE_TYPE = 'VIEW'
AND TABLE_SCHEMA = 'Schema'
我假设我可以使用光标得到结果?
感谢您的帮助。
我假设我可以使用光标得到结果?
你可以,但使用 SQL 生成器和 UNION ALL 可能会更容易。
SQL 生成器看起来像这样(更改模式以适应):
SELECT listagg('select \'' || TABLE_NAME || '\' as VIEW_NAME, (select count(*) from Database_PROD.PROD.' || TABLE_NAME || ') as PROD_COUNT, (select count(*) from Database_PROD.DEV.'
|| TABLE_NAME || ') as DEV_COUNT\n', 'UNION ALL\n') as SQL_TO_RUN
FROM INFORMATION_SCHEMA.TABLES
WHERE 1=1
AND TABLE_CATALOG = 'TEST'
AND TABLE_TYPE = 'VIEW'
AND TABLE_SCHEMA = 'PUBLIC'
;
SQL 生成器将生成一行和一列,以便复制、粘贴或在脚本中使用。它看起来像这样:
select 'MY_VIEW' as VIEW_NAME, (select count(*) from MY_VIEW) as PROD_COUNT, (select count(*) from MY_VIEW) as DEV_COUNT
UNION ALL
select 'MY_VIEW33' as VIEW_NAME, (select count(*) from MY_VIEW123) as PROD_COUNT, (select count(*) from MY_VIEW123) as DEV_COUNT
UNION ALL
select 'MY_VIEW33' as VIEW_NAME, (select count(*) from MY_VIEW123) as PROD_COUNT, (select count(*) from MY_VIEW123) as DEV_COUNT
UNION ALL
select 'MY_VIEWS2' as VIEW_NAME, (select count(*) from MY_VIEWS2) as PROD_COUNT, (select count(*) from MY_VIEWS2) as DEV_COUNT
运行它会产生如下输出:
|VIEW_NAME|PROD_COUNT|DEV_COUNT|
|:---|---:|---:|
|MY_VIEW|25|25|
|MY_VIEW33|25|25|
|MY_VIEW33|25|25|
|MY_VIEWS2|50|50|
您甚至可以让 SQL 生成器添加另一列来比较 PROD_COUNT 和 DEV_COUNT,并在它们匹配或不匹配时报告 true 或 false。