---------------------------------------------------------------------------
---- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
---- 转载务必注明原始出处 : http://blog.csdn.net/andkylee
--- 2010-07-11 11:39:25
---- 关键字: ASE BCP --initstring 有条件 导出数据
----------------------------------------------------------------------------
ASE15.0之前的版本中利用bcp这个实用程序只能够导出整表或视图的数据。要想利用bcp有条件得导出表内数据,只能根据条件建立视图,然后再导出该视图的数据;或者根据条件建立临时表,再导出临时表的数据。但是,都必须在执行bcp命令之前到数据库内部去创建对象(视图或者临时表),然后再执行bcp命令导出视图或者临时表数据。显然,不是太方便。而其它的数据库管理系统,比如sqlserver早在sqlserver2000就实现了根据条件queryout数据的功能。利用sybase ASE的第三方工具按条件导出数据也是一种办法。
在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
上面的这个例子中,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
效果如下:
方法二: 利用隐式创建的视图来由条件导出数据
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
效果如下:
在--initstring中的sql语句中创建了视图V_sysobjects_id_name。 我们来看看bcp导出数据完成后,该视图V_sysobjects_id_name还存在否?
视图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命令罢了。