快速生成bcp in导表命令行的方法
把从Sybase或其它类型数据库导出的文本文件再次导入到sybase数据库的时候,bcp是个很好的工具。
本博客已有3篇关于bcp的文章:
如果要用bcp导入很多的表,对每一个表都要写一条语句是件很费劲的事情,尤其表数量很多的时候。简单的方法呢?
第一种方法: 利用SQL语句
在bcp out导出数据的时候,也就是生成相应的bcp out命令语句的时候,也同时生成bcp in导入的命令语句。
生成导出语句的SQL为:
select "bcp "+db_name()+"."+user_name(uid)+"."+name+" out /tmp/databcpout/" +name+ ".txt -Usa -P<sa_passwd> -S<server_name> -c -T10000000 " from sysobjects where type='U' order by name
其中: 将<sa_passwd>,server_name> 分别替换成sa的密码和数据库服务器名。或者用对想要导出的表有查询权限的用户也行。
生成导入语句的SQL为:
select "bcp "+db_name()+"."+user_name(uid)+"."+name+" in /tmp/databcpout/" +name+ ".txt -Usa -P<sa_passwd> -S<server_name> -c -T10000000 -b10000 " from sysobjects where type='U' order by name
第二种方法: 利用操作系统的工具生成导入命令
windows上生成导入命令的方法:
假设windows上导出的文本文件的扩展名为txt
FOR /F "usebackq tokens=4,* delims= " %i IN (`dir`) DO @echo bcp your_db_name.dbo.%~ni in %i -c -Usa -Psa_passwd -Sserver_name -r\n -b10000
其中:将your_db_name,sa_passwd,server_name分别替换成被导入表所在的数据库,sa的密码,sybase数据库服务名。
-r\n 这个参数是指定导入的文本文件中是unix系统的上换行符。因为这些文件是从solaris数据库服务器上执行bcp得到的。 在windows机器上执行bcp out导出的文本文件中的换行符为:回车+新行 \r\n
如果想在bcp in导入数据前,将表内原来的数据先清空,则可以用下面的命令生成truncate table的SQL语句。
FOR /F "usebackq tokens=4,* delims= " %i IN (`dir`) DO @echo truncate your_db_name.dbo.%~ni
其中:将your_db_name替换成数据库名,确定一下数据库所有者是否为dbo。将生成的SQL语句拷贝到isql下批量执行截断表。
Solaris上用awk实现的命令如下:
find . -name "*.txt" | awk -F"." '{print $2}'| awk -F"/" '{print "bcp pmdb.dbo." $3 " in ." $0 ".txt -Usa -Psybase -Ssyb1503 -c -T10000000 -b10000 "}'
在windows上执行上面的语句的时候,每行的输出结果可能很多,可能会出现折行的情况。
调整命令提示符>布局>屏幕缓存区大小中的宽度和高度即可,如下图:
参考awk以及find命令的用法:
awk用法小结 http://hi.baidu.com/linxhchina/blog/item/8cadc42a4897709b023bf640.html
用du find命令查找文件及用awk 汇总文件大小 http://tlinle.blog.51cto.com/251944/389117