免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5201 | 回复: 4
打印 上一主题 下一主题

Sybase ASE15中bcp实现有条件的导出表内数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-18 13:55 |只看该作者 |倒序浏览
Sybase ASE15.0之前的版本中利用bcp这个实用程序只能够导出整表或视图的数据。要想利用bcp有条件得导出表内数据,只能根据条件建立视图,然后再导出该视图的数据;或者根据条件建立临时表,再导出临时表的数据。但是,都必须在执行bcp命令之前到数据库内部去创建对象(视图或者临时表),然后再执行bcp命令导出视图或者临时表数据。显然,不是太方便。而其它的数据库管理系统,比如sqlserver早在sqlserver2000就实现了根据条件queryout数据的功能。利用sybase ASE的第三方工具按条件导出数据也是一种办法。

在Sybase ASE 15.0及以后版本中,sybase终于提供了按照条件导出表内数据的办法,虽然实现起来还稍微有一点点小麻烦,但是终究是有这个功能了。参数:--initstring 就是为实现这个功能而加的。
关于参数:--initstring的注意事项有:
1.  参数--initstring之后的SQL语句会在数据导出之前被发送到ASE引擎;
2.  参数--initstring之后的SQL语句被当做会话级别的SQL语句一样处理;
3.  参数--initstring之后的SQL语句在整个bcp导出数据会话期间始终有效;
4.  真正导出的数据是关键字bcp和out之间的表的数据,而不是参数--initstring中select列表的数据。
下面开始举几个例子:
bcp导出的是关键字bcp和out之间的表的数据,而不是--initstring中select列表的内容
bcp master..sysobjects out sysobjects.txt --initstring "select id,name,type from master..sysobjects where type='U' " -c -Usa -P -Stest
    C:\Documents and Settings\Administrator>bcp master..sysobjects out sysobjects.tx     
  • t --initstring "select id,name,type from master..sysobjects where type='U' " -c     -Usa -P -Stest     
  • Starting copy...     163 rows copied.     
  • Clock Time (ms.): total = 16
    Avg = 0 (10187.50 rows per sec.)     C:\Documents and Settings\Administrator>more sysobjects.txt     
  • sysobjects      1       1       S       0       97      1       0       229376     Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  • 0       0       0       0       0       0                               1     0000000000000000     
  • sysindexes      2       1       S       0       97      0       0       229376     Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  • 0       0       0       0       0       0                               1     0000000000000000     
  • syscolumns      3       1       S       0       97      0       0       229376     Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  • 0       0       0       0       0       0                               1     0000000000000000     
  • systypes        4       1       S       0       97      1       0       229376     Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  • 0       0       0       0       0       0                               1     0000000000000000     
  • syslogs 8       1       S       0       1       0       0       73728   Dec  2 2     009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0       0     
  • 0       0       0       0       0     syspartitions   28      1       S       0       97      2       0       229376     
  • Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     0       0       0       0       0       0                               1     
  • 0000000000000000     sysgams 14      1       S       0       1       0       0       73728   Dec  2 2     
  • 009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0       0     0       0       0       0       0     
  • systabstats     23      1       S       0       97      1       0       229888     Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  • 0       0       0       0       0       0                               1     0000000000000000     
  • sysusages       31      1       S       0       97      2       0       229376     Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  • 0       0       0       0       0       0                               1     0000000000000000     
  • sysdatabases    30      1       S       0       97      2       0       229376     Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  • 0       0       0       0       0       0                               1     0000000000000000     
  • sysdevices      35      1       S       0       97      1       0       229376     Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  • 0       0       0       0       0       0                               1     0000000000000000     
  • ^C     C:\Documents and Settings\Administrator>
  • C:\Documents and Settings\Administrator>bcp master..sysobjects out sysobjects.tx  t --initstring "select id,name,type from master..sysobjects where type='U' " -c  
  • -Usa -P -Stest  Starting copy...  
  • 163 rows copied.  Clock Time (ms.): total = 16
    Avg = 0 (10187.50 rows per sec.)  
  • C:\Documents and Settings\Administrator>more sysobjects.txt  sysobjects      1       1       S       0       97      1       0       229376  
  • Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  0       0       0       0       0       0                               1  
  • 0000000000000000  sysindexes      2       1       S       0       97      0       0       229376  
  • Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  0       0       0       0       0       0                               1  
  • 0000000000000000  syscolumns      3       1       S       0       97      0       0       229376  
  • Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  0       0       0       0       0       0                               1  
  • 0000000000000000  systypes        4       1       S       0       97      1       0       229376  
  • Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  0       0       0       0       0       0                               1  
  • 0000000000000000  syslogs 8       1       S       0       1       0       0       73728   Dec  2 2  
  • 009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0       0  0       0       0       0       0  
  • syspartitions   28      1       S       0       97      2       0       229376  Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  
  • 0       0       0       0       0       0                               1  0000000000000000  
  • sysgams 14      1       S       0       1       0       0       73728   Dec  2 2  009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0       0  
  • 0       0       0       0       0  systabstats     23      1       S       0       97      1       0       229888  
  • Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  0       0       0       0       0       0                               1  
  • 0000000000000000  sysusages       31      1       S       0       97      2       0       229376  
  • Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  0       0       0       0       0       0                               1  
  • 0000000000000000  sysdatabases    30      1       S       0       97      2       0       229376  
  • Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  0       0       0       0       0       0                               1  
  • 0000000000000000  sysdevices      35      1       S       0       97      1       0       229376  
  • Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  0       0       0       0       0       0                               1  
  • 0000000000000000  ^C  
  • C:\Documents and Settings\Administrator>

上面的这个例子中,sql语句select id,name,type from master..sysobjects where type='U' 虽然被执行了, 但是并没有被反映到导出的结果中。
想导出sysobjects表中用户表的id和name两列数据,可以利用临时表和视图来实现。但是这和ase15以前版本中的临时表和视图还是不一样的。ase15之前版本中临时表或者视图是显示创建的,而在ase15及后续版本中可以利用隐式创建的临时表或者视图来实现根据条件导出数据的要求。
方法一: 利用隐式创建的临时表来由条件导出数据
要求是:导出sysobjects表中用户表的id和name两列数据。bcp命令语句如下:
    bcp #temptbl out sysobjects_id_name.txt --initstring "select id,name into #temptbl
  • from sysobjects where type='U' order by name "  -c -Usa -P -Stest


效果如下:
    C:\Documents and Settings\Administrator>bcp #temptbl out sysobjects_id_name.txt     
  • --initstring "select id,name into #temptbl from sysobjects where type='U' order     by name "  -c -Usa -P -Stest     
  • Starting copy...     87 rows copied.     
  • Clock Time (ms.): total = 16
    Avg = 0 (5437.50 rows per sec.)     C:\Documents and Settings\Administrator>more sysobject_id_name.txt     
  • 233048835       HP_PAGENO_RANGE     1065051799      IVCMPLX     
  • 553049975       IVCON     601050146       IVCPROP     
  • 425049519       IVONEROW     793050830       IVPARAM     
  • 377049348       IVSCHM     457049633       IVSCON     
  • 937051343       IVSHARE     889051172       IVSPROC     
  • 649050317       IVSPROP     1033051685      IVSRVR     
  • 505049804       IVSSYN     985051514       IVSTAT     
  • 841051001       IVSTR     697050488       IVSVIEW     
  • 745050659       IVVCOL     121048436       errorlog     
  • 1337052768      ijdbc_function_escapes     1093575903      jdbc_function_escapes     
  • 265048949       lzflzf     21572084        monCachePool     
  • 2137055618      monCachedObject     533573908       monCachedProcedures     
  • 725574592       monCachedStatement     1753054250      monDataCache     
  • 2041055276      monDeadLock     117572426       monDeviceIO     
  • 1721054136      monEngine     1977055048      monErrorLog     
  • 85572312        monIOQueue     661574364       monLicense     
  • 2009055162      monLocks     1945054934      monNetworkIO     
  • 1881054706      monOpenDatabases     53572198        monOpenObjectActivity     
  • 629574250       monOpenPartitionActivity     757574706       monPCIBridge     
  • 821574934       monPCIEngine     789574820       monPCISlots     
  • 1785054364      monProcedureCache     1817054478      monProcedureCacheMemoryUsage     
  • ^C     C:\Documents and Settings\Administrator>
  • C:\Documents and Settings\Administrator>bcp #temptbl out sysobjects_id_name.txt  --initstring "select id,name into #temptbl from sysobjects where type='U' order  
  • by name "  -c -Usa -P -Stest  Starting copy...  
  • 87 rows copied.  Clock Time (ms.): total = 16
    Avg = 0 (5437.50 rows per sec.)  
  • C:\Documents and Settings\Administrator>more sysobject_id_name.txt  233048835       HP_PAGENO_RANGE  
  • 1065051799      IVCMPLX  553049975       IVCON  
  • 601050146       IVCPROP  425049519       IVONEROW  
  • 793050830       IVPARAM  377049348       IVSCHM  
  • 457049633       IVSCON  937051343       IVSHARE  
  • 889051172       IVSPROC  649050317       IVSPROP  
  • 1033051685      IVSRVR  505049804       IVSSYN  
  • 985051514       IVSTAT  841051001       IVSTR  
  • 697050488       IVSVIEW  745050659       IVVCOL  
  • 121048436       errorlog  1337052768      ijdbc_function_escapes  
  • 1093575903      jdbc_function_escapes  265048949       lzflzf  
  • 21572084        monCachePool  2137055618      monCachedObject  
  • 533573908       monCachedProcedures  725574592       monCachedStatement  
  • 1753054250      monDataCache  2041055276      monDeadLock  
  • 117572426       monDeviceIO  1721054136      monEngine  
  • 1977055048      monErrorLog  85572312        monIOQueue  
  • 661574364       monLicense  2009055162      monLocks  
  • 1945054934      monNetworkIO  1881054706      monOpenDatabases  
  • 53572198        monOpenObjectActivity  629574250       monOpenPartitionActivity  
  • 757574706       monPCIBridge  821574934       monPCIEngine  
  • 789574820       monPCISlots  1785054364      monProcedureCache  
  • 1817054478      monProcedureCacheMemoryUsage  ^C  
  • C:\Documents and Settings\Administrator>


方法二: 利用隐式创建的视图来由条件导出数据
    bcp master..V_sysobjects_id_name out V_sysobjects_id_name.txt   
  • --initstring " create view V_sysobjects_id_name as   
  • select id,name from sysobjects where type='U' " -c -Usa -P -Stest


效果如下:
    C:\Documents and Settings\Administrator>bcp master..V_sysobjects_id_name out V_s     
  • ysobjects_id_name.txt --initstring " create view V_sysobjects_id_name as select   
    id,name
    from sysobjects where type='U'" -c -Usa -P -Stest     
  • Starting copy...     87 rows copied.     
  • Clock Time (ms.): total = 16  Avg = 0 (5437.50 rows per sec.)     C:\Documents and Settings\Administrator>more V_sysobjects_id_name.txt     
  • 1097051913      spt_values     1129052027      spt_monitor     
  • 1177052198      spt_limit_types     1088003876      syblicenseslog     
  • 1225052369      spt_ijdbc_table_types     1257052483      spt_ijdbc_mda     
  • 1305052654      spt_ijdbc_conversion     1337052768      ijdbc_function_escapes     
  • 1593053680      monTables     1625053794      monTableParameters     
  • 1657053908      monTableColumns     1689054022      monState     
  • 1721054136      monEngine     1753054250      monDataCache     
  • 1785054364      monProcedureCache     1817054478      monProcedureCacheMemoryUsage     
  • 1849054592      monProcedureCacheModuleUsage     1881054706      monOpenDatabases     
  • 1913054820      monSysWorkerThread     1945054934      monNetworkIO     
  • 1977055048      monErrorLog     2009055162      monLocks     
  • 2041055276      monDeadLock     2073055390      monWaitClassInfo     
  • 2105055504      monWaitEventInfo     2137055618      monCachedObject     
  • 21572084        monCachePool     53572198        monOpenObjectActivity     
  • 85572312        monIOQueue     117572426       monDeviceIO     
  • 149572540       monSysWaits     181572654       monProcess     
  • 213572768       monProcessLookup     245572882       monProcessActivity     
  • 277572996       monProcessWorkerThread     309573110       monProcessNetIO     
  • 341573224       monProcessObject     373573338       monProcessWaits     
  • 405573452       monProcessStatement     437573566       monSysStatement     
  • 469573680       monProcessSQLText     501573794       monSysSQLText     
  • ^C     C:\Documents and Settings\Administrator>   
  • C:\Documents and Settings\Administrator>bcp master..V_sysobjects_id_name out V_s  ysobjects_id_name.txt --initstring " create view V_sysobjects_id_name as select
  • id,name
    from sysobjects where type='U'" -c -Usa -P -Stest  Starting copy...  
  • 87 rows copied.  Clock Time (ms.): total = 16  Avg = 0 (5437.50 rows per sec.)  
  • C:\Documents and Settings\Administrator>more V_sysobjects_id_name.txt  1097051913      spt_values  
  • 1129052027      spt_monitor  1177052198      spt_limit_types  
  • 1088003876      syblicenseslog  1225052369      spt_ijdbc_table_types  
  • 1257052483      spt_ijdbc_mda  1305052654      spt_ijdbc_conversion  
  • 1337052768      ijdbc_function_escapes  1593053680      monTables  
  • 1625053794      monTableParameters  1657053908      monTableColumns  
  • 1689054022      monState  1721054136      monEngine  
  • 1753054250      monDataCache  1785054364      monProcedureCache  
  • 1817054478      monProcedureCacheMemoryUsage  1849054592      monProcedureCacheModuleUsage  
  • 1881054706      monOpenDatabases  1913054820      monSysWorkerThread  
  • 1945054934      monNetworkIO  1977055048      monErrorLog  
  • 2009055162      monLocks  2041055276      monDeadLock  
  • 2073055390      monWaitClassInfo  2105055504      monWaitEventInfo  
  • 2137055618      monCachedObject  21572084        monCachePool  
  • 53572198        monOpenObjectActivity  85572312        monIOQueue  
  • 117572426       monDeviceIO  149572540       monSysWaits  
  • 181572654       monProcess  213572768       monProcessLookup  
  • 245572882       monProcessActivity  277572996       monProcessWorkerThread  
  • 309573110       monProcessNetIO  341573224       monProcessObject  
  • 373573338       monProcessWaits  405573452       monProcessStatement  
  • 437573566       monSysStatement  469573680       monProcessSQLText  
  • 501573794       monSysSQLText  ^C  
  • C:\Documents and Settings\Administrator>


在--initstring中的sql语句中创建了视图V_sysobjects_id_name。 我们来看看bcp导出数据完成后,该视图V_sysobjects_id_name还存在否?
    1> use master     
  • 2> go     1> select name from sysobjects where name='V_sysobjects_id_name'
  • 2> go      name     
  • -------------------------------------------------------------------------------     --------------------------------------------------------------------------------     
  • --------------------------------------------------------------------------------     ----------------     
  • V_sysobjects_id_name     (1 row affected)     
  • 1>
    1> use master  
  • 2> go  1> select name from sysobjects where name='V_sysobjects_id_name'
  • 2> go   name  
  • -------------------------------------------------------------------------------  --------------------------------------------------------------------------------  
  • --------------------------------------------------------------------------------  ----------------  
  • V_sysobjects_id_name  (1 row affected)  
  • 1>


视图V_sysobjects_id_name仍然是存在的。此种方法和ase12.x中利用显示创建的视图导出数据的方法比较类似,只不过稍微简便些罢了。
总结一下:
1.  ase15.0及后续版本中实现了根据条件导出表的数据,这点很值得庆幸。
2.  此bcp导出的不是参数--initstring中sql语句的结果,而仍然是关键字bcp和out之间的表的数据。
3.  增加的参数--initstring实际上就是实现了能够利用bcp工具向ASE引擎发送sql命令而已。
4.  参数--initstring中的sql语句在导出数据整个会话期间有效。所以,导出--initstring中创建的临时表是可能的。
5.  归根结底,bcp增加的这个新特性,仅仅是能够通过bcp向ase引擎发送sql命令罢了。

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2010-10-18 15:50 |只看该作者
转载的我的帖子: ASE15中bcp可以实现有条件的导出表内数据了http://blog.csdn.net/andkylee/archive/2010/07/12/5726694.aspx
http://blog.csdn.net/andkylee/archive/2010/07/12/5726694.aspx

也不注明出处。

论坛徽章:
33
ChinaUnix元老
日期:2018-07-04 15:10:362015年亚洲杯之阿联酋
日期:2015-02-06 17:15:532015亚冠之武里南联
日期:2015-06-06 15:40:252015亚冠之北京国安
日期:2015-06-17 15:42:412022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:322015亚冠之阿尔纳斯尔
日期:2015-09-20 09:42:1215-16赛季CBA联赛之北京
日期:2016-01-15 10:03:5915-16赛季CBA联赛之青岛
日期:2016-04-26 16:44:4915-16赛季CBA联赛之广夏
日期:2018-07-04 15:33:21C
日期:2016-10-25 16:12:142017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之同曦
日期:2017-02-22 22:41:10
3 [报告]
发表于 2010-10-18 16:19 |只看该作者
这个功能如果在最早的12.5的版本中有的话,估计原来的工作要省去很多事。

现在想想那个维护,采用BCP简直是场恶梦!

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2010-10-18 17:35 |只看该作者
回复 3# wfcjz


用视图的话, 麻烦是麻烦一些, 但是对于大表在sybase中用bcp效率是最高的。

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
5 [报告]
发表于 2010-10-19 12:06 |只看该作者
我用的那些default charset是iso_1的,有时候bcp一些有加密内容或含巨类型的表时,会发生bcp out得出来,bcp in不进去。
后来,我全都用replication server转数据了,效率似乎也不差。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP