程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase綜合文章 >> Sybase ASE15中bcp實現有條件的導出表內數據

Sybase ASE15中bcp實現有條件的導出表內數據

編輯:SyBase綜合文章

Sybase ASE15.0之前的版本中利用bcp這個實用程序只能夠導出整表或視圖的數據。要想利用bcp有條件得導出表內數據,只能根據條件建立視圖,然後再導出該視圖的數據;或者根據條件建立臨時表,再導出臨時表的數據。但是,都必須在執行bcp命令之前到數據庫內部去創建對象(視圖或者臨時表),然後再執行bcp命令導出視圖或者臨時表數據。顯然,不是太方便。而其它的數據庫管理系統,比如sqlserver早在sqlserver2000就實現了根據條件queryout數據的功能。利用Sybase ASE的第三方工具按條件導出數據也是一種辦法。

專題:Sybase何處去?

在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

  1. C:\Documents and Settings\Administrator>bcp master..sysobjects out sysobjects.tx     
  2. t --initstring "select id,name,type from master..sysobjects where type='U' " -c     
  3. -Usa -P -Stest     
  4. Starting copy...     
  5. 163 rows copIEd.     
  6. Clock Time (ms.): total = 16  Avg = 0 (10187.50 rows per sec.)     
  7. C:\Documents and Settings\Administrator>more sysobjects.txt     
  8. sysobjects      1       1       S       0       97      1       0       229376     
  9. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  10. 0       0       0       0       0       0                               1     
  11. 0000000000000000     
  12. sysindexes      2       1       S       0       97      0       0       229376     
  13. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  14. 0       0       0       0       0       0                               1     
  15. 0000000000000000     
  16. syscolumns      3       1       S       0       97      0       0       229376     
  17. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  18. 0       0       0       0       0       0                               1     
  19. 0000000000000000     
  20. systypes        4       1       S       0       97      1       0       229376     
  21. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  22. 0       0       0       0       0       0                               1     
  23. 0000000000000000     
  24. syslogs 8       1       S       0       1       0       0       73728   Dec  2 2     
  25. 009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0       0     
  26. 0       0       0       0       0     
  27. syspartitions   28      1       S       0       97      2       0       229376     
  28. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  29. 0       0       0       0       0       0                               1     
  30. 0000000000000000     
  31. sysgams 14      1       S       0       1       0       0       73728   Dec  2 2     
  32. 009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0       0     
  33. 0       0       0       0       0     
  34. systabstats     23      1       S       0       97      1       0       229888     
  35. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  36. 0       0       0       0       0       0                               1     
  37. 0000000000000000     
  38. sysusages       31      1       S       0       97      2       0       229376     
  39. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  40. 0       0       0       0       0       0                               1     
  41. 0000000000000000     
  42. sysdatabases    30      1       S       0       97      2       0       229376     
  43. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  44. 0       0       0       0       0       0                               1     
  45. 0000000000000000     
  46. sysdevices      35      1       S       0       97      1       0       229376     
  47. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0     
  48. 0       0       0       0       0       0                               1     
  49. 0000000000000000     
  50. ^C     
  51. C:\Documents and Settings\Administrator>    
  52. C:\Documents and Settings\Administrator>bcp master..sysobjects out sysobjects.tx  
  53. t --initstring "select id,name,type from master..sysobjects where type='U' " -c  
  54. -Usa -P -Stest  
  55. Starting copy...  
  56. 163 rows copIEd.  
  57. Clock Time (ms.): total = 16  Avg = 0 (10187.50 rows per sec.)  
  58. C:\Documents and Settings\Administrator>more sysobjects.txt  
  59. sysobjects      1       1       S       0       97      1       0       229376  
  60. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  
  61. 0       0       0       0       0       0                               1  
  62. 0000000000000000  
  63. sysindexes      2       1       S       0       97      0       0       229376  
  64. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  
  65. 0       0       0       0       0       0                               1  
  66. 0000000000000000  
  67. syscolumns      3       1       S       0       97      0       0       229376  
  68. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  
  69. 0       0       0       0       0       0                               1  
  70. 0000000000000000  
  71. systypes        4       1       S       0       97      1       0       229376  
  72. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  
  73. 0       0       0       0       0       0                               1  
  74. 0000000000000000  
  75. syslogs 8       1       S       0       1       0       0       73728   Dec  2 2  
  76. 009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0       0  
  77. 0       0       0       0       0  
  78. syspartitions   28      1       S       0       97      2       0       229376  
  79. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  
  80. 0       0       0       0       0       0                               1  
  81. 0000000000000000  
  82. sysgams 14      1       S       0       1       0       0       73728   Dec  2 2  
  83. 009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0       0  
  84. 0       0       0       0       0  
  85. systabstats     23      1       S       0       97      1       0       229888  
  86. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  
  87. 0       0       0       0       0       0                               1  
  88. 0000000000000000  
  89. sysusages       31      1       S       0       97      2       0       229376  
  90. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  
  91. 0       0       0       0       0       0                               1  
  92. 0000000000000000  
  93. sysdatabases    30      1       S       0       97      2       0       229376  
  94. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  
  95. 0       0       0       0       0       0                               1  
  96. 0000000000000000  
  97. sysdevices      35      1       S       0       97      1       0       229376  
  98. Dec  2 2009  6:58:34:590PM      Dec  2 2009  6:58:34:590PM      0       0  
  99. 0       0       0       0       0       0                               1  
  100. 0000000000000000  
  101. ^C  
  102. 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命令語句如下:

  1. bcp #temptbl out sysobjects_id_name.txt 
  2. --initstring "select id,name into #temptbl 
  3. from sysobjects where type='U' order by name "  -c -Usa -P -Stest 

效果如下:
 

  1. C:\Documents and Settings\Administrator>bcp #temptbl out sysobjects_id_name.txt     
  2. --initstring "select id,name into #temptbl from sysobjects where type='U' order     
  3. by name "  -c -Usa -P -Stest     
  4. Starting copy...     
  5. 87 rows copIEd.     
  6. Clock Time (ms.): total = 16  Avg = 0 (5437.50 rows per sec.)     
  7. C:\Documents and Settings\Administrator>more sysobject_id_name.txt     
  8. 233048835       HP_PAGENO_RANGE     
  9. 1065051799      IVCMPLX     
  10. 553049975       IVCON     
  11. 601050146       IVCPROP     
  12. 425049519       IVONEROW     
  13. 793050830       IVPARAM     
  14. 377049348       IVSCHM     
  15. 457049633       IVSCON     
  16. 937051343       IVSHARE     
  17. 889051172       IVSPROC     
  18. 649050317       IVSPROP     
  19. 1033051685      IVSRVR     
  20. 505049804       IVSSYN     
  21. 985051514       IVSTAT     
  22. 841051001       IVSTR     
  23. 697050488       IVSVIEW     
  24. 745050659       IVVCOL     
  25. 121048436       errorlog     
  26. 1337052768      ijdbc_function_escapes     
  27. 1093575903      jdbc_function_escapes     
  28. 265048949       lzflzf     
  29. 21572084        monCachePool     
  30. 2137055618      monCachedObject     
  31. 533573908       monCachedProcedures     
  32. 725574592       monCachedStatement     
  33. 1753054250      monDataCache     
  34. 2041055276      monDeadLock     
  35. 117572426       monDeviceIO     
  36. 1721054136      monEngine     
  37. 1977055048      monErrorLog     
  38. 85572312        monIOQueue     
  39. 661574364       monLicense     
  40. 2009055162      monLocks     
  41. 1945054934      monNetworkIO     
  42. 1881054706      monOpenDatabases     
  43. 53572198        monOpenObjectActivity     
  44. 629574250       monOpenPartitionActivity     
  45. 757574706       monPCIBridge     
  46. 821574934       monPCIEngine     
  47. 789574820       monPCISlots     
  48. 1785054364      monProcedureCache     
  49. 1817054478      monProcedureCacheMemoryUsage     
  50. ^C     
  51. C:\Documents and Settings\Administrator>    
  52. C:\Documents and Settings\Administrator>bcp #temptbl out sysobjects_id_name.txt  
  53. --initstring "select id,name into #temptbl from sysobjects where type='U' order  
  54. by name "  -c -Usa -P -Stest  
  55. Starting copy...  
  56. 87 rows copIEd.  
  57. Clock Time (ms.): total = 16  Avg = 0 (5437.50 rows per sec.)  
  58. C:\Documents and Settings\Administrator>more sysobject_id_name.txt  
  59. 233048835       HP_PAGENO_RANGE  
  60. 1065051799      IVCMPLX  
  61. 553049975       IVCON  
  62. 601050146       IVCPROP  
  63. 425049519       IVONEROW  
  64. 793050830       IVPARAM  
  65. 377049348       IVSCHM  
  66. 457049633       IVSCON  
  67. 937051343       IVSHARE  
  68. 889051172       IVSPROC  
  69. 649050317       IVSPROP  
  70. 1033051685      IVSRVR  
  71. 505049804       IVSSYN  
  72. 985051514       IVSTAT  
  73. 841051001       IVSTR  
  74. 697050488       IVSVIEW  
  75. 745050659       IVVCOL  
  76. 121048436       errorlog  
  77. 1337052768      ijdbc_function_escapes  
  78. 1093575903      jdbc_function_escapes  
  79. 265048949       lzflzf  
  80. 21572084        monCachePool  
  81. 2137055618      monCachedObject  
  82. 533573908       monCachedProcedures  
  83. 725574592       monCachedStatement  
  84. 1753054250      monDataCache  
  85. 2041055276      monDeadLock  
  86. 117572426       monDeviceIO  
  87. 1721054136      monEngine  
  88. 1977055048      monErrorLog  
  89. 85572312        monIOQueue  
  90. 661574364       monLicense  
  91. 2009055162      monLocks  
  92. 1945054934      monNetworkIO  
  93. 1881054706      monOpenDatabases  
  94. 53572198        monOpenObjectActivity  
  95. 629574250       monOpenPartitionActivity  
  96. 757574706       monPCIBridge  
  97. 821574934       monPCIEngine  
  98. 789574820       monPCISlots  
  99. 1785054364      monProcedureCache  
  100. 1817054478      monProcedureCacheMemoryUsage  
  101. ^C  
  102. C:\Documents and Settings\Administrator> 

方法二: 利用隱式創建的視圖來由條件導出數據

  1. bcp master..V_sysobjects_id_name out V_sysobjects_id_name.txt   
  2. --initstring " create vIEw V_sysobjects_id_name as   
  3. select id,name from sysobjects where type='U' " -c -Usa -P -Stest 

效果如下:

  1. C:\Documents and Settings\Administrator>bcp master..V_sysobjects_id_name out V_s     
  2. ysobjects_id_name.txt --initstring " create vIEw V_sysobjects_id_name as select     
  3. id,name from sysobjects where type='U'" -c -Usa -P -Stest     
  4. Starting copy...     
  5. 87 rows copIEd.     
  6. Clock Time (ms.): total = 16  Avg = 0 (5437.50 rows per sec.)     
  7. C:\Documents and Settings\Administrator>more V_sysobjects_id_name.txt     
  8. 1097051913      spt_values     
  9. 1129052027      spt_monitor     
  10. 1177052198      spt_limit_types     
  11. 1088003876      syblicenseslog     
  12. 1225052369      spt_ijdbc_table_types     
  13. 1257052483      spt_ijdbc_mda     
  14. 1305052654      spt_ijdbc_conversion     
  15. 1337052768      ijdbc_function_escapes     
  16. 1593053680      monTables     
  17. 1625053794      monTableParameters     
  18. 1657053908      monTableColumns     
  19. 1689054022      monState     
  20. 1721054136      monEngine     
  21. 1753054250      monDataCache     
  22. 1785054364      monProcedureCache     
  23. 1817054478      monProcedureCacheMemoryUsage     
  24. 1849054592      monProcedureCacheModuleUsage     
  25. 1881054706      monOpenDatabases     
  26. 1913054820      monSysWorkerThread     
  27. 1945054934      monNetworkIO     
  28. 1977055048      monErrorLog     
  29. 2009055162      monLocks     
  30. 2041055276      monDeadLock     
  31. 2073055390      monWaitClassInfo     
  32. 2105055504      monWaitEventInfo     
  33. 2137055618      monCachedObject     
  34. 21572084        monCachePool     
  35. 53572198        monOpenObjectActivity     
  36. 85572312        monIOQueue     
  37. 117572426       monDeviceIO     
  38. 149572540       monSysWaits     
  39. 181572654       monProcess     
  40. 213572768       monProcessLookup     
  41. 245572882       monProcessActivity     
  42. 277572996       monProcessWorkerThread     
  43. 309573110       monProcessNetIO     
  44. 341573224       monProcessObject     
  45. 373573338       monProcessWaits     
  46. 405573452       monProcessStatement     
  47. 437573566       monSysStatement     
  48. 469573680       monProcessSQLText     
  49. 501573794       monSysSQLText     
  50. ^C     
  51. C:\Documents and Settings\Administrator>    
  52. C:\Documents and Settings\Administrator>bcp master..V_sysobjects_id_name out V_s  
  53. ysobjects_id_name.txt --initstring " create vIEw V_sysobjects_id_name as select  
  54. id,name from sysobjects where type='U'" -c -Usa -P -Stest  
  55. Starting copy...  
  56. 87 rows copIEd.  
  57. Clock Time (ms.): total = 16  Avg = 0 (5437.50 rows per sec.)  
  58. C:\Documents and Settings\Administrator>more V_sysobjects_id_name.txt  
  59. 1097051913      spt_values  
  60. 1129052027      spt_monitor  
  61. 1177052198      spt_limit_types  
  62. 1088003876      syblicenseslog  
  63. 1225052369      spt_ijdbc_table_types  
  64. 1257052483      spt_ijdbc_mda  
  65. 1305052654      spt_ijdbc_conversion  
  66. 1337052768      ijdbc_function_escapes  
  67. 1593053680      monTables  
  68. 1625053794      monTableParameters  
  69. 1657053908      monTableColumns  
  70. 1689054022      monState  
  71. 1721054136      monEngine  
  72. 1753054250      monDataCache  
  73. 1785054364      monProcedureCache  
  74. 1817054478      monProcedureCacheMemoryUsage  
  75. 1849054592      monProcedureCacheModuleUsage  
  76. 1881054706      monOpenDatabases  
  77. 1913054820      monSysWorkerThread  
  78. 1945054934      monNetworkIO  
  79. 1977055048      monErrorLog  
  80. 2009055162      monLocks  
  81. 2041055276      monDeadLock  
  82. 2073055390      monWaitClassInfo  
  83. 2105055504      monWaitEventInfo  
  84. 2137055618      monCachedObject  
  85. 21572084        monCachePool  
  86. 53572198        monOpenObjectActivity  
  87. 85572312        monIOQueue  
  88. 117572426       monDeviceIO  
  89. 149572540       monSysWaits  
  90. 181572654       monProcess  
  91. 213572768       monProcessLookup  
  92. 245572882       monProcessActivity  
  93. 277572996       monProcessWorkerThread  
  94. 309573110       monProcessNetIO  
  95. 341573224       monProcessObject  
  96. 373573338       monProcessWaits  
  97. 405573452       monProcessStatement  
  98. 437573566       monSysStatement  
  99. 469573680       monProcessSQLText  
  100. 501573794       monSysSQLText  
  101. ^C  
  102. C:\Documents and Settings\Administrator> 

在--initstring中的sql語句中創建了視圖V_sysobjects_id_name。 我們來看看bcp導出數據完成後,該視圖V_sysobjects_id_name還存在否?

  1. 1> use master     
  2. 2> go     
  3. 1> select name from sysobjects where name='V_sysobjects_id_name'    
  4. 2> go     
  5.  name     
  6.  -------------------------------------------------------------------------------     
  7. --------------------------------------------------------------------------------     
  8. --------------------------------------------------------------------------------     
  9. ----------------     
  10.  V_sysobjects_id_name     
  11. (1 row affected)     
  12. 1>    
  13. 1> use master  
  14. 2> go  
  15. 1> select name from sysobjects where name='V_sysobjects_id_name' 
  16. 2> go  
  17.  name  
  18.  -------------------------------------------------------------------------------  
  19. --------------------------------------------------------------------------------  
  20. --------------------------------------------------------------------------------  
  21. ----------------  
  22.  V_sysobjects_id_name  
  23. (1 row affected)  
  24. 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命令罷了。

作者簡介:andkylee,5年Sybase管理、維護經驗。現任職於北京一IT運維管理公司,Sybase DBA。熟悉Sybase的安裝、配置、調優、監控與排錯,尤其精通Sybase數據庫的災難恢復。自己深入研究Sybase數據庫的內部物理存儲結構,開發了能夠從Sybase數據庫設備文件中提取數據的工具;還編寫了一個能夠分析Sybase日志文件內容,反解析出相應SQL語句的程序。可以提供Sybase數據庫非常規恢復技術支持。Sybase非常規數據庫恢復包括:設備文件故障(如:頁面邏輯損壞,頁面物理損壞等,605、692錯誤等等),誤操作(包括:誤更新update,誤刪除drop table,誤清空數據truncate table,等)等,本人都有相應的處理辦法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved