送个 shell for Sco Unix 5.05 脚本给各位,
可在 sybase 用户下创建,将其命名为 bcpoutdata 。
然后 chmod a+x bcpoutdata
在 sybase 用户下运行 bcpoutdata 即可。
注:
1)将 database_name 改为你的数据库名。
2)将 pas 改为你的 sa 口令。
3)将 server 改为你的 SQL server 名。
4)要导入,将 out 改为 in 即可。
最后提醒你,别忘了要在 sybase 用户下创建一个目录,
把 bcpoutdata 置入其中,再运行。
什麽?你要打包、压缩。
哈,在后面加几条:
tar cvf data.tar *.bcp
compress data.tar
rm *.bcp
愿各位好运
isql -Usa -Ppas -Sserver -otables.tmp <<-EOF
USE database_name
GO
SELECT name FROM sysobjects WHERE type='U' ORDER BY name
GO
exit
EOF
vi tables.tmp <<EOF 2>/dev/null
:1,2 d
:$ d
:1,$ <<<
: x
EOF
total=`cat tables.tmp|wc -l`
current=0
for table in `cat tables.tmp`
do
current=$current+1
echo "*** $current/$total bcpout $table ***"
bcp database_name..$table out $table.bcp -Usa -Ppas -Sserver -Jiso_1 -c
echo "*** $table done ***\n"
done
rm tables.tmp
chenfeng825 回复于:2003-08-22 11:18:18
不错,很有用!
Blackrose 回复于:2003-08-22 12:27:37
不错
shell 比较熟悉 在 unix 上真是 如虎添翼.........
li2002 回复于:2003-08-25 10:15:25
问一句:vi中的
:1,$ <<<
是什么意思??
yoof 回复于:2003-08-25 14:17:54
1,2 d
:$ d
:1,$ <<<
分别是什么意思??? 请楼主详细说明一下 还用它们的用法
newnewhua 回复于:2003-08-28 00:06:50
各位高手,能解释一下:
vi tables.tmp <<EOF 2>/dev/null
:1,2 d
:$ d
:1,$ <<<
: x
EOF
是什么意思吗?
钟鼓柳 回复于:2003-08-28 09:26:40
觉得如果某表含加密字段,用上述方法倒出,没问题,但是导入后,恐怕不能用啊!
各位有人试过么?
noabc 回复于:2003-08-28 21:39:05
bcp 选项用 -n,要不你也许会遇到问题
hu1234567890 回复于:2003-09-04 21:33:52
首先感谢诸位对此文的兴趣,现解释如下:
一、导出用户数据库中的表,将其置入文件 tables.tmp 中。
isql -Usa -Ppas -Sserver -otables.tmp <<-EOF
USE database_name
GO
SELECT name FROM sysobjects WHERE type='U' ORDER BY name
GO
exit
EOF
二、编辑 tables.tmp ,因 tables.tmp 中首两行和末三行,
是我们不要的东西。前次的有小小错,现更正如下:
vi tables.tmp <<EOF 2>/dev/null
:1,2 d (删首两行)
:$ (到末行)
:-2,. d (删末三行)
:1,$ <<< (清各行左侧空格,即各行顶左。当然一个 < 也够用,1,$ 也可换成 % )
: x
EOF
至如 <<EOF ... ... EOF ,批处理执行时,我们要屏蔽一些东西,
使它们不在屏上显示,哈哈、、、就用它了。
找本书看看,再在 SHELL 下,带 <<EOF ... ... EOF 项或不带该项
键入上述脚本,你就会有收获的。EOF 可用其他字母,但前后必须一致。
三、导出用户数据库各表中的数据
total=`cat tables.tmp|wc -l` (总表数)
current=0 (当前的第 n 张表)
for table in `cat tables.tmp` (将文件 tables.tmp 中的表名依次赋给 table)
do
current=$current+1
echo "*** $current/$total bcpout $table ***"
bcp database_name..$table out $table.bcp -Usa -Ppas -Sserver -Jiso_1 -c
echo "*** $table done ***\n"
done
rm tables.tmp
pengxb 回复于:2003-09-05 13:35:43
不错!将-c换成-n就更完美了!(有money子段的表,加-n会避免一些应用上的问题)
Eisen 回复于:2003-09-05 14:12:40
还是有点问题——在通导的时候,遇上有identity字段的表,如何处理那个-E参数呢?
zhangyh123 回复于:2003-09-05 15:17:39
不错 。另外,对于 text 或者 imag 列 好象没有处理,
如果有分区表,那就更要改不少了
看来 还是要手工调整一些东东 。
hu1234567890 回复于:2003-09-05 19:13:08
这是鄙人工作之谈中的少少部分,放入此意在抛砖引玉。
用此结构可作许多变通,如:
1、
truncate table
update statistics
2、
按条件备份部分数据,这样首先你要对 tables.tmp 编辑,加
入要检索的字段如:
表名1:字段名
表名2:字段名
... ...
其次要用到select into from
再次修改 for ... ... done 中的脚本,加入一些东西,
如:
echo $table > tables.tmp
table1=`cut -f1, -d: tables.tmp`
table2=`cut -f2, -d: tables.tmp`
3、还可在脚本前加入键入sa口令等选单。
我做了大量的脚本,给工作带来了很多便利。
什么?..贴出来!当然是不可能的,自己动手那才有乐趣呢。
愿与各位交流。
我只和纯数据打交道,诸位有其它请加入。
syxie 回复于:2005-01-16 18:15:26
这个脚本还有一个地方没有考虑,我也曾经写过类似的shell脚本,请大家使用时注意:
如果操作系统的LANG设置和数据库的语言不一致时,使用isql 的时候,会打印一些提示,刚好在前两行。
这样这个脚本使用的时候就有一点问题,如果个人用用还是挺方便的,但是如果做成版本或者商用的话,就请注意一下。
hiaw 回复于:2005-02-23 11:55:38
请教各位大虾,在NT中用bcp out 或in 时,可以直接使用 -n 而不用 -c 吗?
是不是用 -n 比 -c 更好些呢?
但为什么一般大家使用的都是 -c 呢?
小弟在这先谢了!
tony_go 回复于:2005-02-26 14:34:10
-n 快,但不能在不同操作系统中移植
-c 稍慢,但能在不同操作系统中移植
赛北之狼 回复于:2005-03-14 22:38:41
提醒:将-c 修改为-n 后也会有问题,对如表中有text字段的,如果bcp out ,bcp in 前后sybase的字符集不一致会导致table 不可用,需要用dbfix 修复一把
hefan 回复于:2005-03-17 15:50:23
select 'bcp XXX..'+name+' out c:\'+name+'.txt -Usa -P -SYYY -n' from XXX.sysobjects where type='U'
其中XXX是数据库的名字,YYY是服务器的名字,这个语句可以一次得出bcp out整个数据库的语句,将结果保持成一个批处理直接执行就可以了。
baiqiepian 回复于:2005-08-18 16:14:05
顶
|