我正在尝试使用列名将一堆DB2表导出到CSV。我看不出有任何直接的方法可以做到这一点。我遵循this来获取所需的数据。但是我必须在数百个表上执行。有没有一种方法可以动态获取给定N个模式名称的所有列和表?
我还尝试了this,该模式将所有表以模式导出到csv,但这并没有给我列名。因此,如果有人可以向我展示如何更改此脚本以在CSV中获取列名称,那么我的工作就完成了。
服务器正在运行:Red Hat Linux服务器。
答案 0 :(得分:0)
尝试使用这个出色的工具:https://www.sql-workbench.eu/。它是通用的,您可以在任何类型的数据库马达之间传输数据。
答案 1 :(得分:0)
以下db2命令生成导出脚本:
export to exp.sql of del modified by nochardel
select
x'0a'||'export to file_header of del modified by nochardel VALUES '''||columns||''''
||x'0a'||'export to file_data of del messages messages.msg select '||columns||' from '||tabname_full
||x'0a'||'! cat file_header file_data > '||tabname_full||'.csv'
from
(
select rtrim(c.tabschema)||'.'||c.tabname as tabname_full, listagg(c.colname, ', ') as columns
from syscat.tables t
join syscat.columns c on c.tabschema=t.tabschema and c.tabname=t.tabname
where t.tabschema='SYSIBM' and t.type='T'
group by c.tabschema, c.tabname
--fetch first 10 row only
)
;
最好将上面的命令放置到gen_exp.sql
之类的文件中并运行它以生成导出脚本:
db2 -tf gen_exp.sql
导出脚本exp.sql
由每个表的3个命令组成:
* db2 export
命令可获取以逗号分隔的列列表
* db2 export
命令来获取表数据
*串联命令,将以上两个输出收集到一个文件中
您可以按以下方式运行此脚本:
db2 -vf exp.sql -z exp.sql.log
gen_exp_sh.sql:
export to exp.sh of del modified by nochardel
select
x'0a'||'echo "'||columns||'" > '||filename
||x'0a'||'db2 "export to pipe_data of del messages messages.msg select '||columns||' from '||tabname_full||'" >/dev/null 2>&1 </dev/null &'
||x'0a'||'cat pipe_data >> '||filename
from
(
select
rtrim(c.tabschema)||'.'||c.tabname as tabname_full
, rtrim(c.tabschema)||'.'||c.tabname||'.csv' as filename
, listagg(c.colname, ', ') as columns
from syscat.tables t
join syscat.columns c on c.tabschema=t.tabschema and c.tabname=t.tabname
where t.tabschema='SYSIBM' and t.type='T'
group by c.tabschema, c.tabname
--fetch first 10 row only
)
;
运行如下:
db2 -tf gen_exp_sh.sql
导出shell脚本exp.sh
由每个表的3个命令组成:
* echo命令可将以逗号分隔的列列表写入文件
* db2 export命令获取表数据到管道(从后台启动)
*简单的cat
命令可从管道读取数据并将数据添加到具有列列表的同一文件
用法:
您必须先创建管道,然后再创建源(dot space script
符号,这很重要)导出脚本:
mkfifo pipe_data
db2 connect to mydb ...
. ./exp.sh
rm -f pipe_data