ASE15中bcp可以實現有條件的匯出表內資料了

來源:互聯網
上載者:User

---------------------------------------------------------------------------

---- 本文為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

 

C:/Documents and Settings/Administrator>bcp master..sysobjects out sysobjects.tx<br />t --initstring "select id,name,type from master..sysobjects where type='U' " -c<br />-Usa -P -Stest<br />Starting copy...<br />163 rows copied.<br />Clock Time (ms.): total = 16 Avg = 0 (10187.50 rows per sec.)<br />C:/Documents and Settings/Administrator>more sysobjects.txt<br />sysobjects 1 1 S 0 97 1 0 229376<br />Dec 2 2009 6:58:34:590PM Dec 2 2009 6:58:34:590PM 0 0<br />0 0 0 0 0 0 1<br />0000000000000000<br />sysindexes 2 1 S 0 97 0 0 229376<br />Dec 2 2009 6:58:34:590PM Dec 2 2009 6:58:34:590PM 0 0<br />0 0 0 0 0 0 1<br />0000000000000000<br />syscolumns 3 1 S 0 97 0 0 229376<br />Dec 2 2009 6:58:34:590PM Dec 2 2009 6:58:34:590PM 0 0<br />0 0 0 0 0 0 1<br />0000000000000000<br />systypes 4 1 S 0 97 1 0 229376<br />Dec 2 2009 6:58:34:590PM Dec 2 2009 6:58:34:590PM 0 0<br />0 0 0 0 0 0 1<br />0000000000000000<br />syslogs 8 1 S 0 1 0 0 73728 Dec 2 2<br />009 6:58:34:590PM Dec 2 2009 6:58:34:590PM 0 0 0<br />0 0 0 0 0<br />syspartitions 28 1 S 0 97 2 0 229376<br />Dec 2 2009 6:58:34:590PM Dec 2 2009 6:58:34:590PM 0 0<br />0 0 0 0 0 0 1<br />0000000000000000<br />sysgams 14 1 S 0 1 0 0 73728 Dec 2 2<br />009 6:58:34:590PM Dec 2 2009 6:58:34:590PM 0 0 0<br />0 0 0 0 0<br />systabstats 23 1 S 0 97 1 0 229888<br />Dec 2 2009 6:58:34:590PM Dec 2 2009 6:58:34:590PM 0 0<br />0 0 0 0 0 0 1<br />0000000000000000<br />sysusages 31 1 S 0 97 2 0 229376<br />Dec 2 2009 6:58:34:590PM Dec 2 2009 6:58:34:590PM 0 0<br />0 0 0 0 0 0 1<br />0000000000000000<br />sysdatabases 30 1 S 0 97 2 0 229376<br />Dec 2 2009 6:58:34:590PM Dec 2 2009 6:58:34:590PM 0 0<br />0 0 0 0 0 0 1<br />0000000000000000<br />sysdevices 35 1 S 0 97 1 0 229376<br />Dec 2 2009 6:58:34:590PM Dec 2 2009 6:58:34:590PM 0 0<br />0 0 0 0 0 0 1<br />0000000000000000<br />^C<br />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<br />--initstring "select id,name into #temptbl from sysobjects where type='U' order<br />by name " -c -Usa -P -Stest<br />Starting copy...<br />87 rows copied.<br />Clock Time (ms.): total = 16 Avg = 0 (5437.50 rows per sec.)<br />C:/Documents and Settings/Administrator>more sysobject_id_name.txt<br />233048835 HP_PAGENO_RANGE<br />1065051799 IVCMPLX<br />553049975 IVCON<br />601050146 IVCPROP<br />425049519 IVONEROW<br />793050830 IVPARAM<br />377049348 IVSCHM<br />457049633 IVSCON<br />937051343 IVSHARE<br />889051172 IVSPROC<br />649050317 IVSPROP<br />1033051685 IVSRVR<br />505049804 IVSSYN<br />985051514 IVSTAT<br />841051001 IVSTR<br />697050488 IVSVIEW<br />745050659 IVVCOL<br />121048436 errorlog<br />1337052768 ijdbc_function_escapes<br />1093575903 jdbc_function_escapes<br />265048949 lzflzf<br />21572084 monCachePool<br />2137055618 monCachedObject<br />533573908 monCachedProcedures<br />725574592 monCachedStatement<br />1753054250 monDataCache<br />2041055276 monDeadLock<br />117572426 monDeviceIO<br />1721054136 monEngine<br />1977055048 monErrorLog<br />85572312 monIOQueue<br />661574364 monLicense<br />2009055162 monLocks<br />1945054934 monNetworkIO<br />1881054706 monOpenDatabases<br />53572198 monOpenObjectActivity<br />629574250 monOpenPartitionActivity<br />757574706 monPCIBridge<br />821574934 monPCIEngine<br />789574820 monPCISlots<br />1785054364 monProcedureCache<br />1817054478 monProcedureCacheMemoryUsage<br />^C<br />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<br />ysobjects_id_name.txt --initstring " create view V_sysobjects_id_name as select<br />id,name from sysobjects where type='U'" -c -Usa -P -Stest<br />Starting copy...<br />87 rows copied.<br />Clock Time (ms.): total = 16 Avg = 0 (5437.50 rows per sec.)<br />C:/Documents and Settings/Administrator>more V_sysobjects_id_name.txt<br />1097051913 spt_values<br />1129052027 spt_monitor<br />1177052198 spt_limit_types<br />1088003876 syblicenseslog<br />1225052369 spt_ijdbc_table_types<br />1257052483 spt_ijdbc_mda<br />1305052654 spt_ijdbc_conversion<br />1337052768 ijdbc_function_escapes<br />1593053680 monTables<br />1625053794 monTableParameters<br />1657053908 monTableColumns<br />1689054022 monState<br />1721054136 monEngine<br />1753054250 monDataCache<br />1785054364 monProcedureCache<br />1817054478 monProcedureCacheMemoryUsage<br />1849054592 monProcedureCacheModuleUsage<br />1881054706 monOpenDatabases<br />1913054820 monSysWorkerThread<br />1945054934 monNetworkIO<br />1977055048 monErrorLog<br />2009055162 monLocks<br />2041055276 monDeadLock<br />2073055390 monWaitClassInfo<br />2105055504 monWaitEventInfo<br />2137055618 monCachedObject<br />21572084 monCachePool<br />53572198 monOpenObjectActivity<br />85572312 monIOQueue<br />117572426 monDeviceIO<br />149572540 monSysWaits<br />181572654 monProcess<br />213572768 monProcessLookup<br />245572882 monProcessActivity<br />277572996 monProcessWorkerThread<br />309573110 monProcessNetIO<br />341573224 monProcessObject<br />373573338 monProcessWaits<br />405573452 monProcessStatement<br />437573566 monSysStatement<br />469573680 monProcessSQLText<br />501573794 monSysSQLText<br />^C<br />C:/Documents and Settings/Administrator>

 

在--initstring中的sql語句中建立了視圖V_sysobjects_id_name。 我們來看看bcp匯出資料完成後,該視圖V_sysobjects_id_name還存在否?

1> use master<br />2> go<br />1> select name from sysobjects where name='V_sysobjects_id_name'<br />2> go<br /> name<br /> -------------------------------------------------------------------------------<br />--------------------------------------------------------------------------------<br />--------------------------------------------------------------------------------<br />----------------<br /> V_sysobjects_id_name<br />(1 row affected)<br />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命令罷了。

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.