《數(shù)據(jù)庫(kù)原理及應(yīng)用-(SQLServer2008版)》唐國(guó)良蔡中民-第11章_第1頁(yè)
《數(shù)據(jù)庫(kù)原理及應(yīng)用-(SQLServer2008版)》唐國(guó)良蔡中民-第11章_第2頁(yè)
《數(shù)據(jù)庫(kù)原理及應(yīng)用-(SQLServer2008版)》唐國(guó)良蔡中民-第11章_第3頁(yè)
《數(shù)據(jù)庫(kù)原理及應(yīng)用-(SQLServer2008版)》唐國(guó)良蔡中民-第11章_第4頁(yè)
《數(shù)據(jù)庫(kù)原理及應(yīng)用-(SQLServer2008版)》唐國(guó)良蔡中民-第11章_第5頁(yè)
已閱讀5頁(yè),還剩141頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第11章數(shù)據(jù)導(dǎo)入和導(dǎo)出在建立一個(gè)數(shù)據(jù)庫(kù)之后,將分散在各處的不同類型的數(shù)據(jù)匯總在這個(gè)新建的數(shù)據(jù)庫(kù)中時(shí),就需要對(duì)數(shù)據(jù)進(jìn)行導(dǎo)入與導(dǎo)出操作。作為數(shù)據(jù)庫(kù)的基本操作之一,導(dǎo)入/導(dǎo)出對(duì)DBA來說是一項(xiàng)極具挑戰(zhàn)性的工作。SQLServer作為一款主流數(shù)據(jù)庫(kù)平臺(tái),提供了強(qiáng)大、豐富的數(shù)據(jù)導(dǎo)入導(dǎo)出功能。MicrosoftSQLServer允許在SQLServer表和數(shù)據(jù)文件之間大容量導(dǎo)入和導(dǎo)出大容量數(shù)據(jù),這對(duì)在SQLServer和異類數(shù)據(jù)源之間有效傳輸數(shù)據(jù)是非常重要的?!按笕萘繉?dǎo)出”是指將數(shù)據(jù)從SQLServer表導(dǎo)出到數(shù)據(jù)文件,“大容量導(dǎo)入”是指將數(shù)據(jù)從數(shù)據(jù)文件加載到SQLServer表。例如,您可以將數(shù)據(jù)從MicrosoftExcel應(yīng)用程序?qū)С龅綌?shù)據(jù)文件,然后將這些數(shù)據(jù)大容量導(dǎo)入到SQLServer表中。在SQLServer中可以使用Transact-SQL對(duì)數(shù)據(jù)導(dǎo)入導(dǎo)出,也可調(diào)用命令行工具BCP導(dǎo)入導(dǎo)出數(shù)據(jù)。本章的學(xué)習(xí)目標(biāo):了解有關(guān)數(shù)據(jù)導(dǎo)入導(dǎo)出的基本概念掌握使用Transact-SQL對(duì)數(shù)據(jù)導(dǎo)入導(dǎo)出掌握使用命令行工具BCP處理數(shù)據(jù)11.1.使用Transact-SQL進(jìn)行數(shù)據(jù)導(dǎo)入導(dǎo)出使用Transact-SQL進(jìn)行數(shù)據(jù)導(dǎo)入導(dǎo)出就是通過SQL語句將相同或不同類型的數(shù)據(jù)庫(kù)中的數(shù)據(jù)互相導(dǎo)入導(dǎo)出或者匯集在一起。如果是在不同的SQLServer數(shù)據(jù)庫(kù)之間進(jìn)行數(shù)據(jù)導(dǎo)入導(dǎo)出,那將是非常容易做到的,一般可使用SELECTINTOFROM和INSERTINTO。使用SELECTINTOFROM時(shí)INTO后跟的表必須存在,即在導(dǎo)入數(shù)據(jù)之前先建立一個(gè)空表,然后再將源表中的數(shù)據(jù)導(dǎo)入到新建的空表中,這就相當(dāng)于表的復(fù)制(但不會(huì)復(fù)制表的索引等信息)。而INSERTINTO的功能是將源數(shù)據(jù)插入到已經(jīng)存在的表中,可以使用它進(jìn)行數(shù)據(jù)合并,如果要更新已經(jīng)存在的記錄,須使用UPDATE。11.1.1同構(gòu)數(shù)據(jù)庫(kù)之間的進(jìn)行數(shù)據(jù)導(dǎo)入導(dǎo)出(1)語法格式:SELECT*INTOnew_table_nameFROMold_tablename--new_table_name和old_tablename的表結(jié)構(gòu)相同功能:使用SELECTINTO插入行SELECTINTO語句用于創(chuàng)建一個(gè)新表,并用SELECT語句的結(jié)果集填充該表。SELECTINTO可將幾個(gè)表或視圖中的數(shù)據(jù)組合成一個(gè)表。也可用于創(chuàng)建一個(gè)包含選自鏈接服務(wù)器的數(shù)據(jù)的新表。新表的結(jié)構(gòu)由選擇列表中表達(dá)式的屬性定義?!纠?1-1】制作"student"表的備份。在【查詢】窗口中輸入如下代碼,并【執(zhí)行】之以查看結(jié)果。USEstu_info;GOSELECT* --把所有的列插入新表INTOstudent_backupFROMstudent;GO【例11-2】從student、course、grade三表中選擇6列來創(chuàng)建所有選修課程的學(xué)生的成績(jī)表dbo.score。在【查詢】窗口中輸入如下代碼,并【執(zhí)行】之以查看結(jié)果。USEstu_info;GOSELECTs.s_idas學(xué)號(hào),s.snameas姓名,s.ssexas性別,c.c_idas課程號(hào),ameas課程名,g.gradeAS[成績(jī)]INTOdbo.scoreFROMstudentASsJOINgradeASgONs.s_id=g.s_idJOINcourseAScONc.c_id=g.c_idGO注意,即使源表已分區(qū),也不能使用SELECTINTO創(chuàng)建已分區(qū)的表。SELECTINTO不使用源表的分區(qū)方案。相反,新表是在默認(rèn)文件組中創(chuàng)建的。若要將行插入已分區(qū)的表中,必須首先創(chuàng)建已分區(qū)的表,然后使用INSERTINTO…SELECTFROM語句。(2)語法格式:INSERTINTOtable2SELECT*FROMtable3--table2和table3的表結(jié)構(gòu)相同【例11-3】使用INSERTINTO…SELECTFROM語句提取student表中男生的學(xué)號(hào)、姓名、出生日期到新表stu中。在【查詢】窗口中輸入如下代碼,并【執(zhí)行】之以查看結(jié)果。USEstu_info;GOCREATETABLEstu(

s_idchar(10)NOTNULL,

snamenvarchar(5),

sbirthday

datetime);GOINSERTINTOstu

SELECTs_id,sname,sbirthday

FROMstudent

WHEREssex=N'男';GOSELECTs_id,sname,sbirthdayFROMstu;GO11.1.2異構(gòu)數(shù)據(jù)庫(kù)之間的進(jìn)行數(shù)據(jù)導(dǎo)入導(dǎo)出當(dāng)在異構(gòu)數(shù)據(jù)庫(kù)間進(jìn)行數(shù)據(jù)導(dǎo)入導(dǎo)出時(shí),情況會(huì)變得復(fù)雜得多。首先要解決的是如何打開非SQLServer數(shù)據(jù)庫(kù)的問題。在SQLServer中提供了兩個(gè)函數(shù)可以根據(jù)各種類型數(shù)據(jù)庫(kù)的OLEDBProvider打開并操作這些數(shù)據(jù)庫(kù),這兩個(gè)函數(shù)是OPENDATASOURCE和OPENROWSET。它們的功能基本上相同,不同之處主要有兩點(diǎn)。1.調(diào)用方式不同OPENDATASOURCE的參數(shù)有兩個(gè),分別是OLEDBProvider和連接字符串。使用OPENDATASOURCE只相當(dāng)于引用數(shù)據(jù)庫(kù)或者是服務(wù)(對(duì)于SQLServer、Oracle等數(shù)據(jù)庫(kù)來說)。要想引用其中的數(shù)據(jù)表或視圖,必須在OPENDATASOURCE(...)后進(jìn)行引用?!纠?1-4】OPENDATASOURCE和OPENROWSET的使用對(duì)比。(1)SQLServer數(shù)據(jù)庫(kù)和Access數(shù)據(jù)庫(kù)之間的數(shù)據(jù)導(dǎo)入導(dǎo)出(a)導(dǎo)入Access數(shù)據(jù)庫(kù)數(shù)據(jù)到SQLServer數(shù)據(jù)庫(kù)表如圖11-1和11-2所示,創(chuàng)建Access數(shù)據(jù)庫(kù)c:\abc.mdb,然后創(chuàng)建表LectureTable,并輸入如圖11-2所示數(shù)據(jù)。圖11-1LectureTable的結(jié)構(gòu)在SQLServer中通過OPENDATASOURCE查詢Access數(shù)據(jù)庫(kù)abc.mdb中的LectureTable表。在【MicrosoftSQLServerManagementStudio】的【查詢】窗口輸入如下語句,然后執(zhí)行、并查看新導(dǎo)入的表lectureSqlServerTable。USEstu_info;GOSELECT*INTOlectureSqlServerTableFROMOPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Provider=Microsoft.Jet.OLEDB.4.0;

DataSource=c:\abc.mdb;PersistSecurityInfo=false')...LectureTable

--注意,上面“...LectureTable”中的是英文狀態(tài)下的三個(gè)點(diǎn)?;蛘呤褂肙PENROWSET。OPENROWSET相當(dāng)于一個(gè)記錄集,可以將直接當(dāng)成一個(gè)表或視圖使用。圖11-2LectureTable表的數(shù)據(jù)在SQLServer中通過OPENROWSET查詢Access數(shù)據(jù)庫(kù)abc.mdb中的LectureTable表。在【MicrosoftSQLServerManagementStudio】的【查詢】窗口輸入如下語句,然后執(zhí)行、并查看結(jié)果。USEstu_info;GOSELECT*FROMOPENROWSET('Microsoft.Jet.OLEDB.4.0','c:\abc.mdb';'admin';'','SELECT*FROMLectureTable')(b)導(dǎo)出SQLServer數(shù)據(jù)庫(kù)表數(shù)據(jù)到Access數(shù)據(jù)庫(kù)導(dǎo)出SQLServer數(shù)據(jù)庫(kù)stu_info中的表lectureSqlServerTable的數(shù)據(jù)到Access數(shù)據(jù)庫(kù)c:\abc.mdb中的LectureTable中。表lectureSqlServerTable的結(jié)構(gòu)如圖11-3語句如下所示。USEstu_info;GOINSERTINTOOPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Provider=Microsoft.Jet.OLEDB.4.0;DataSource=c:\abc.mdb;PersistSecurityInfo=False')...LectureTableSELECT*FROMlectureSqlServerTable;圖11-3表lectureSqlServerTable的結(jié)構(gòu)打開access數(shù)據(jù)庫(kù)的OLEDBProvider叫Microsoft.Jet.OLEDB.4.0,需要注意的是操作非SQLServer數(shù)據(jù)庫(kù)在OPENDATASOURCE(...)后面引用數(shù)據(jù)庫(kù)中的表時(shí)使用"...,而不是.。(2).SQLServer數(shù)據(jù)庫(kù)和文本文件之間的數(shù)據(jù)導(dǎo)入導(dǎo)出(a)導(dǎo)入.txt文件數(shù)據(jù)到SQLServer數(shù)據(jù)庫(kù)表新建一個(gè)文本文件C:\data.txt,如圖11-4所示。--導(dǎo)入.txt文件到SQLServer數(shù)據(jù)庫(kù)中USEstu_info;GOSELECT*INTOtext1FROMOPENDATASOURCE('MICROSOFT.JET.OLEDB.4.0',

'Text;HDR=Yes;DATABASE=C:\')...[data#txt]這條SQL語句的功能是將c盤根目錄的data.txt文件導(dǎo)入到SQLServer數(shù)據(jù)庫(kù)表text1表中,在這里文件名中的.要使用#代替。圖11-4data.txt文件內(nèi)容(b)導(dǎo)出SQLServer數(shù)據(jù)庫(kù)表到.txt文件在向文本導(dǎo)出時(shí),不僅文本文件要存在,而且第一行必須和要導(dǎo)出表的字段一致。--如果要用下面的語句插入的話,文本文件data.txt必須存在,--而且有一行:講座ID,講座名稱,地點(diǎn),開始日期,結(jié)束日期,開始時(shí)間,終止時(shí)間,所需人員數(shù)--然后就可以用下面的語句進(jìn)行插入--注意文件名和目錄根據(jù)實(shí)際情況進(jìn)行修改.USEstu_info;GOinsertintoopendatasource('MICROSOFT.JET.OLEDB.4.0','Text;HDR=Yes;

DATABASE=C:\')...[data#txt]SELECT*FROMlectureSqlServerTable如果要導(dǎo)出SQLServer表的部分字段到文本文件.txt,可使用USEstu_info;GOINSERTINTOOPENROWSET('MICROSOFT.JET.OLEDB.4.0','Text;HDR=Yes;DATABASE=C:\',

'SELECTID,講座名稱FROM[data#txt]')SELECTCONVERT(varbinary(255),ID),講座名稱IDFROMtext1;(3).SQLServer數(shù)據(jù)庫(kù)和Excel文件之間的數(shù)據(jù)導(dǎo)入導(dǎo)出。--excel<>SQLServer--32-bit,usingtheMicrosoft.Jet.OLEDB.4.0driverwithOPENDATASOURCE:

--insertintoanexcelspreadsheetfile-filemustexistwithpropercolumnnamesandbeclosed(a)導(dǎo)出SQLServer數(shù)據(jù)庫(kù)表到Excel文件執(zhí)行命令前,C:\Temp\LectureExcelSheet.xls文件必須存在,且工作表Sheet1的第一行如圖11-5所示。USEstu_info;GOINSERTINTOOPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',

'DataSource=C:\Temp\LectureExcelSheet.xls;

ExtendedProperties=Excel8.0')...[Sheet1$](ID,講座名稱)SELECTID,講座名稱FROMlectureSqlServerTable;圖11-5LectureExcelSheet.xls的內(nèi)容--也可用下面的格式INSERTINTOOPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',

'Excel8.0;Database=C:\Temp\LectureExcelSheet.xls')...[Sheet1$](ID,講座名稱)SELECTID,講座名稱FROMlectureSqlServerTable;(b)導(dǎo)入excel文件到SQLServer數(shù)據(jù)庫(kù)表Select查詢代碼如下所示。--selectfromexcelspreadsheetfileSELECT*FROMOPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',

'DataSource=C:\Temp\test.xls;ExtendedProperties=Excel8.0')...[Sheet1$]SELECT*FROMOPENROWSET('Microsoft.Jet.OLEDB.4.0',

'Excel8.0;Database=C:\Temp\LectureExcelSheet.xls','select*from[Sheet1$]');SELECT*FROMOPENROWSET('Microsoft.Jet.OLEDB.4.0',

'Excel8.0;Database=C:\Temp\LectureExcelSheet.xls',[Sheet1$]);Insertinto代碼如下所示。--32-bit,usingtheMicrosoft.Jet.OLEDB.4.0driverwithOPENROWSET:--workswithspacesintheworksheetname--執(zhí)行此語句時(shí)Excel文件必須關(guān)閉INSERTINTOOPENROWSET('Microsoft.Jet.OLEDB.4.0',

'Excel8.0;Database=C:\Temp\LectureExcelSheet.xls','select*from[Sheet1$]')(ID,講座名稱)SELECTID,講座名稱FROMlectureSqlServerTable;(4)異構(gòu)的數(shù)據(jù)庫(kù)之間進(jìn)行數(shù)據(jù)傳輸在異構(gòu)的數(shù)據(jù)庫(kù)之間進(jìn)行數(shù)據(jù)傳輸,可以使用SQLServer提供的兩個(gè)系統(tǒng)函數(shù)OPENDATASOURCE和OPENROWSET。OPENDATASOURCE可以打開任何支持OLEDB的數(shù)據(jù)庫(kù),并且可以將OPENDATASOURCE做為SELECT、UPDATE、INSERT和DELETE后所跟的表名。如SELECT*FROMOPENDATASOURCE('SQLOLEDB','DataSource=T-35E047250FA24;InitialCatalog=stu_info;PersistSecurityInfo=True;UserID=sa;password=sa123').stu_info.dbo.student--或SELECT*FROMOPENDATASOURCE('SQLOLEDB','DataSource=;InitialCatalog=stu_info;PersistSecurityInfo=True;UserID=sa;password=sa123').stu_info.dbo.student這條語句的功能是查詢(單機(jī)測(cè)試時(shí)可換成)這臺(tái)機(jī)器中SQLServer數(shù)據(jù)庫(kù)stu_info中的student表。從這條語句可以看出,OPENDATASOURCE有兩個(gè)參數(shù),第一個(gè)參數(shù)是provider_name,表示用于訪問數(shù)據(jù)源的OLEDB提供程序的PROGID的名稱。provider_name的數(shù)據(jù)類型為char,沒有默認(rèn)值。第二個(gè)參數(shù)是連接字符串,根據(jù)OLEDBProvider不同而不同(如果不清楚自己所使用的OLEDBProvider的連接字符串,可以使用visualstudio開發(fā)工具中的【服務(wù)器資源管理器】【新建連接】來自動(dòng)生成相應(yīng)的連接字符串)。SQLServer數(shù)據(jù)庫(kù)和SQLServer數(shù)據(jù)庫(kù)之間的數(shù)據(jù)導(dǎo)入導(dǎo)出。--導(dǎo)入數(shù)據(jù)SELECT*INTOstudent1FROMOPENDATASOURCE('SQLOLEDB','DataSource=;InitialCatalog=stu_info;PersistSecurityInfo=True;UserID=sa;password=sa123').stu_info.dbo.student導(dǎo)出數(shù)據(jù)INSERTINTOOPENDATASOURCE('SQLOLEDB','DataSource=;InitialCatalog=stu_info;PersistSecurityInfo=True;UserID=sa;password=sa123').stu_info.dbo.student

select*fromadageOfEncouragement.dbo.student1;--在這條語句中OPENDATASOURCE(...)可以理解為SQLServer的一個(gè)服務(wù),.pubs.dbo.authors是這個(gè)服務(wù)管理的一個(gè)數(shù)據(jù)庫(kù)的一個(gè)表authors。使用INSERTINTO時(shí)OPENDATASOURCE(...)后跟的表必須存在。也可以將以上的OPENDATASOURCE換成OPENROWSETINSERTINTOOPENROWSET('SQLOLEDB','';'sa';'sa123','select*fromadageOfEncouragement.dbo.student1')SELECT*FROMstu_info.dbo.student--使用OPENROWSET要注意一點(diǎn),'52';'sa';'abc'中間是";",而不是","。OPENDATASOURCE和OPENROWSET都不接受參數(shù)變量。

2.靈活度不同。OPENDATASOURCE只能打開相應(yīng)數(shù)據(jù)庫(kù)中的表或視圖,如果需要過濾的話,只能在SQLServer中進(jìn)行處理。而OPENROWSET可以在打開數(shù)據(jù)庫(kù)的同時(shí)對(duì)其進(jìn)行過濾,如上面的例子,在OPENROWSET中可以使用SELECT*FROMtable1對(duì)abc.mdb中的數(shù)據(jù)表進(jìn)行查詢,而OPENDATASOURCE只能引用LectureTable,而無法查詢LectureTable。因此,OPENROWSET比較OPENDATASOURCE更加靈活。11.2.使用命令行BCP導(dǎo)入導(dǎo)出數(shù)據(jù)很多大型的系統(tǒng)不僅提供了友好的圖形用戶接口,同時(shí)也提供了命令行方式對(duì)系統(tǒng)進(jìn)行控制。在SQLServer中除了可以使用SQL語句對(duì)數(shù)據(jù)進(jìn)行操作外,還可以使用一個(gè)命令行工具BCP對(duì)數(shù)據(jù)進(jìn)行同樣的操作。BCP是基于DB-Library客戶端庫(kù)的工具。它的功能十分強(qiáng)大,BCP能夠以并行方式將數(shù)據(jù)從多個(gè)客戶端大容量導(dǎo)入到單個(gè)表中,從而大大提高了裝載效率。但在執(zhí)行并行操作時(shí)要注意的是只有使用基于ODBC或SQLOLEDB的API的應(yīng)用程序才可以執(zhí)行將數(shù)據(jù)并行裝載到單個(gè)表中的操作。BCP可以將SQLServer中的數(shù)據(jù)導(dǎo)出到任何OLEDB所支持的數(shù)據(jù)庫(kù)的,本節(jié)包含以下示例:(1)將表中記錄導(dǎo)入到數(shù)據(jù)文件(使用可信連接)(2)將文件中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)表中(3)將特定的列導(dǎo)出到數(shù)據(jù)文件中(4)將特定的行到數(shù)據(jù)文件中(5)將查詢中的數(shù)據(jù)導(dǎo)出到數(shù)據(jù)文件中(6)創(chuàng)建XML格式化文件(7)使用格式化文件進(jìn)行bcp

大容量導(dǎo)入(8)使用格式化文件大容量導(dǎo)入數(shù)據(jù) 11.2.1將表中記錄導(dǎo)入到數(shù)據(jù)文件(使用可信連接)(1)將表中記錄導(dǎo)入到數(shù)據(jù)文件(使用可信連接)下面的例題假定您使用Windows身份驗(yàn)證,并且與運(yùn)行bcp命令所針對(duì)的服務(wù)器實(shí)例之間具有可信連接?!纠?1-5】bcp的out選項(xiàng)的使用。創(chuàng)建一個(gè)名為Student.dat的數(shù)據(jù)文件,并使用字符格式將Stu_info.dbo.student表數(shù)據(jù)導(dǎo)入該文件中。在命令提示符處輸入以下命令:bcp

Stu_info.dbo.studentoutStudent.dat-T-c【例11-6】使用BCP可信連接形式將student表數(shù)據(jù)導(dǎo)出到excel文件中。在命令提示符處輸入以下命令:bcp

stu_info.dbo.studentoutc:\temp1.xls-c-q–T或bcp

stu_info.dbo.studentoutc:\temp2.xls-c–q-S"35178C38F4B34B1\SQLEXPRESS"–T注意:使用了-T選項(xiàng),所以不用-U和-P選項(xiàng).但要寫-S選項(xiàng)指定服務(wù)器名和實(shí)例名,若您的SQLServer2008不是默認(rèn)實(shí)例,否則會(huì)報(bào)錯(cuò)“SQLState=08001,NativeError=17,Error=[Microsoft][ODBCSQLServerDriver][Shared

Memory]SQLServer不存在或訪問被拒絕”。(2)將表中記錄導(dǎo)入到數(shù)據(jù)文件中(使用混合模式身份驗(yàn)證)以下示例假定使用混合模式身份驗(yàn)證,必須使用-U開關(guān)指定登錄ID。并且,除非是連接到本地計(jì)算機(jī)上SQLServer的默認(rèn)實(shí)例,否則請(qǐng)使用-S開關(guān)指定系統(tǒng)名稱和實(shí)例名稱(可選)?!纠?1-7】bcp的out選項(xiàng)的使用。創(chuàng)建一個(gè)名為Student.dat的數(shù)據(jù)文件,并使用字符格式將Stu_info.dbo.student表數(shù)據(jù)導(dǎo)出到該文件中。語句如下:bcp

Stu_info.dbo.studentoutStudent.dat-c-U<login_id>-S<server_name\instance_name>系統(tǒng)將提示您輸入密碼?!纠?1-8】使用BCP指定服務(wù)器名、用戶名和密碼的連接形式將student表導(dǎo)出到excel文件中C:\DocumentsandSettings\datang>bcp

stu_info.dbo.studentoutc:\temp2.xls-c-q-S"35178C38F4B34B1\SQLEXPRESS"-U"sa"-P"sa123"本例使用的語法格式:bcp數(shù)據(jù)庫(kù)名.dbo.表名out"c:test.xls"-c-S"服務(wù)器名"/U"用戶名"-P"密碼"注意,在使用密碼登錄時(shí)需要將-U后的用戶名和-P后的密碼加上英文的雙引號(hào)?!纠?1-9】BCP不僅能夠通過命令行執(zhí)行,同時(shí)也可以通過SQL執(zhí)行,這需要調(diào)用一個(gè)系統(tǒng)擴(kuò)展存儲(chǔ)過程(extendedstoredprocedure)xp_cmdshell以SQL語句的方式來運(yùn)行BCP。本例使用的語法格式:EXECmaster..xp_cmdshell'bcp數(shù)據(jù)庫(kù)名.dbo.表名out"c:test.xls"/c-/S"服務(wù)器名"/U"用戶名"-P"密碼"'例11-9的命令可改寫為如下形式。EXECmaster..xp_cmdshell'bcp

stu_info.dbo.studentout"C:\bcpTest\temp3.xls"-c-q-S"35178C38F4B34B1\SQLEXPRESS"-T'和EXECmaster..xp_cmdshell'bcp

stu_info.dbo.studentout"C:\bcpTest\temp2.xls"-c-q-S"35178C38F4B34B1\SQLEXPRESS"-U"sa"-P"sa123"'具體執(zhí)行SQL代碼如下--Toallowadvancedoptionstobechanged(允許配置高級(jí)選項(xiàng)).EXECsp_configure'showadvancedoptions',1GO--Toupdatethecurrentlyconfiguredvalueforadvancedoptions.RECONFIGURE --重新配置GO--Toenablexp_cmdshellfeature.EXECsp_configure'xp_cmdshell',1--啟用xp_cmdshell,默認(rèn)情況下是禁用的。GO--Toupdatethecurrentlyconfiguredvalueforthisfeature.RECONFIGURE --重新配置GO--要確保"C:\bcpTest\"為共享文件夾且“允許網(wǎng)絡(luò)用戶更改我的文件”。,--否則會(huì)報(bào)錯(cuò)"Error=[Microsoft][SQLNativeClient]無法打開BCP主數(shù)據(jù)文件"。EXECmaster..xp_cmdshell'bcp

stu_info.dbo.studentout"C:\bcpTest\temp2.xls"-c-q-S"35178C38F4B34B1\SQLEXPRESS"-U"sa"-P"sa123"'GO--用完后,要記得將xp_cmdshell禁用(從安全角度安全考慮)--允許配置高級(jí)選項(xiàng)EXECsp_configure'showadvancedoptions',1GORECONFIGURE--重新配置GOEXECsp_configure'xp_cmdshell',0--禁用xp_cmdshellGORECONFIGUREGO在【查詢】窗口單擊【執(zhí)行】之以查看結(jié)果??吹斤@示信息如下:消息15281,級(jí)別16,狀態(tài)1,過程xp_cmdshell,第1行SQLServer阻止了對(duì)組件'xp_cmdshell'的過程'sys.xp_cmdshell'的訪問,因?yàn)榇私M件已作為此服務(wù)器安全配置的一部分而被關(guān)閉。系統(tǒng)管理員可以通過使用sp_configure

啟用'xp_cmdshell'。也可通過【功能的外圍應(yīng)用配置器】啟用xp_cmdshell

,如圖16-所示。圖11-6對(duì)象資源管理器【例11-10】對(duì)要導(dǎo)出的表進(jìn)行過濾。BCP不僅可以接受表名或視圖名做為參數(shù),也可以接受SQL做為參數(shù)。通過SQL語句可以對(duì)要導(dǎo)出的表進(jìn)行過濾,然后導(dǎo)出過濾后的記錄。EXECmaster..xp_cmdshell'BCP"SELECTTOP20*FROMAdventureWorks.sales.student"queryoutc:\student2.txt-c-U"sa"-P"password"'BCP還可以通過簡(jiǎn)單地設(shè)置選項(xiàng)對(duì)導(dǎo)出的行進(jìn)行限制。EXECmaster..xp_cmdshell'BCP"SELECTTOP20*FROMAdventureWorks.sales.student"queryoutc:\student2.txt-F10-L13-c-U"sa"-P"password"'這條命令使用了兩個(gè)參數(shù)-F10和-L13,表示從SELECTTOP20*FROMAdventureWorks.sales.student所查出來的結(jié)果中取第10條到13條記錄進(jìn)行導(dǎo)出。【例11-11】使用bcp實(shí)用程序?qū)С鰯?shù)據(jù)的命令,將數(shù)據(jù)庫(kù)stu_info.dbo.student表數(shù)據(jù)導(dǎo)入文本文件C:\bcpTest\temp4.txt中,該文本文件中各字段值用“Tab”分隔,每行以換行符結(jié)束。命令代碼如下:bcpstu_info.dbo.student4out"C:\bcpTest\temp4.txt"-c-q-S"35178C38F4B34B1\SQLEXPRESS"–T和

EXECmaster..xp_cmdshell'bcpstu_info.dbo.student4out"C:\bcpTest\temp4.txt"-c-q-S"35178C38F4B34B1\SQLEXPRESS"-T'注意:必須在一個(gè)完整行中輸入該命令,不能加入任何硬回車。11.2.2將文件中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)表中【例11-12】闡釋bcp命令的in選項(xiàng)。創(chuàng)建一個(gè)Student表的空副本Student2,例中創(chuàng)建的文件(Student.dat)中的數(shù)據(jù)將被到該副本中。該例使用Windows身份驗(yàn)證,并且與運(yùn)行bcp命令所針對(duì)的服務(wù)器實(shí)例之間具有可信連接。(1)創(chuàng)建空表,在【查詢】編輯器中輸入以下命令:USEStu_info;GOSELECT*INTOStu_info.dbo.student2FROMStu_info.dbo.studentWHERE1=2(2)將字符數(shù)據(jù)大容量到新表中(即導(dǎo)入數(shù)據(jù))。在命令提示符處輸入以下命令:bcpStu_info.dbo.student2inStudent.dat-T-c(3)驗(yàn)證命令是否成功,并在查詢編輯器中顯示表的內(nèi)容。輸入以下命令:USEStu_info;GOSELECT*FROMdbo.Student2;【例11-13】使用bcp實(shí)用程序?qū)霐?shù)據(jù)的命令,將文件c:\temp1.xls數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)stu_info.dbo.student表中,命令代碼如下。(1)使用混合模式身份驗(yàn)證C:\DocumentsandSettings\datang>bcpstu_info.dbo.student3inc:\temp1.xls-c–q-S"35178C38F4B34B1\SQLEXPRESS"-U"sa"-P"sa123"開始...已了82行。數(shù)據(jù)包的大?。ㄗ止?jié)):4096時(shí)鐘時(shí)間(毫秒):共47(2)使用可信連接:C:\DocumentsandSettings\datang>bcpstu_info.dbo.student4inc:\temp1.xls-c-q-S"35178C38F4B34B1\SQLEXPRESS"-T開始...已了82行。數(shù)據(jù)包的大?。ㄗ止?jié)):4096時(shí)鐘時(shí)間(毫秒):共16【例11-14】使用bcp實(shí)用程序?qū)霐?shù)據(jù)的命令,將文本文件C:\bcpTest\temp4.txt中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)stu_info.dbo.student4表中,該文本文件中各字段值用“Tab”分隔,每行以換行符結(jié)束。命令代碼如下:bcpstu_info.dbo.student4in"C:\bcpTest\temp4.txt"-c-q-S"35178C38F4B34B1\SQLEXPRESS"–T和

EXECmaster..xp_cmdshell'stu_info.dbo.student4in"C:\bcpTest\temp4.txt"-c-q-S"35178C38F4B34B1\SQLEXPRESS"-T'11.2.3將特定的列導(dǎo)出到數(shù)據(jù)文件中若要導(dǎo)出特定列,須使用queryout選項(xiàng)?!纠?1-15】?jī)H將Student表中的sname列導(dǎo)出到數(shù)據(jù)文件中。該例使用Windows身份驗(yàn)證,并且與運(yùn)行bcp命令所針對(duì)的服務(wù)器實(shí)例之間具有可信連接。在Windows命令提示符下,輸入以下內(nèi)容:bcp"SELECTNameFROMstu_info.dbo.student"queryout"C:\bcpTest\Student.Name.dat"-c-S"35178C38F4B34B1\SQLEXPRESS"-T11.2.4將特定的行到數(shù)據(jù)文件中若要特定行,可以使用queryout選項(xiàng)?!纠?1-16】將男生信息從student表中到數(shù)據(jù)文件(maleStudent.dat)中。該例使用Windows身份驗(yàn)證,并且與運(yùn)行bcp命令所針對(duì)的服務(wù)器實(shí)例之間具有可信連接。在Windows命令提示符下,輸入以下內(nèi)容:bcp"SELECT*FROMstu_info.dbo.studentWHEREssex='男'"queryout"maleStudent.dat"-T-c11.2.5將查詢中的數(shù)據(jù)導(dǎo)出到數(shù)據(jù)文件中若要將Transact-SQL語句的結(jié)果集導(dǎo)出到數(shù)據(jù)文件中,可使用queryout選項(xiàng)?!纠?1-17】將stu_info.dbo.student表中的姓名到Contacts.txt數(shù)據(jù)文件中,這些姓名按升序排序。該例使用Windows身份驗(yàn)證,并且與運(yùn)行bcp命令所針對(duì)的服務(wù)器實(shí)例之間具有可信連接。在Windows命令提示符下,輸入以下內(nèi)容:bcp"SELECTsnameFROMstu_info.dbo.studentORDERBYsname"queryout

Contacts.txt-c-T11.2.6創(chuàng)建XML格式化文件【例11-16】為stu_info.dbo.student表創(chuàng)建一個(gè)名為Student.xml的XML格式化文件。該例使用Windows身份驗(yàn)證,并且與運(yùn)行bcp命令所針對(duì)的服務(wù)器實(shí)例之間具有可信連接。在Windows命令提示符下,輸入以下內(nèi)容:bcp

Stu_info.dbo.studentformatnul-T-c-x-fStudent.xml注意:若要使用-x開關(guān),則必須使用bcp9.0客戶端。11.2.7使用格式化文件進(jìn)行bcp

大容量導(dǎo)入向SQLServer的實(shí)例中導(dǎo)入數(shù)據(jù)時(shí),若要使用以前創(chuàng)建的格式化文件,請(qǐng)同時(shí)使用-f開關(guān)和in選項(xiàng)。【例11-18】使用例11-16創(chuàng)建的格式化文件(Student.xml),將數(shù)據(jù)文件Student.dat的內(nèi)容大容量到Sales.Student表的副本(Student2)中。該例使用Windows身份驗(yàn)證,并且與運(yùn)行bcp命令所針對(duì)的服務(wù)器實(shí)例之間具有可信連接。在Windows命令提示符下,輸入以下內(nèi)容:bcpStu_info.dbo.student2inStudent.dat-T-fStudent.xml11.2.8使用格式化文件大容量導(dǎo)入數(shù)據(jù)在SQLServer2008及更高版本中,大容量導(dǎo)入操作中可以使用格式化文件。格式化文件可將數(shù)據(jù)文件的各字段映射到SQLServer表的各列。當(dāng)使用bcp命令或者BULKINSERT或INSERT...SELECT*FROMOPENROWSET(BULK...)Transact-SQL命令時(shí),可以使用非XML或XML格式文件來大容量導(dǎo)入數(shù)據(jù)。對(duì)于用于Unicode字符數(shù)據(jù)文件的格式化文件,所有輸入字段必須為Unicode文本字符串(即固定大小Unicode字符串或字符終止Unicode字符串)。下表11-1匯總了各個(gè)大容量導(dǎo)入命令的格式化文件選項(xiàng)。表11-1大容量導(dǎo)入命令的格式化文件選項(xiàng)大容量加載命令使用格式化文件選項(xiàng)BULKINSERTFORMATFILE='format_file_path'INSERT..SELECT*FROMOPENROWSET(BULK...)FORMATFILE='format_file_path'bcp…in-fformat_file注意,若要大容量導(dǎo)出或?qū)隨QLXML數(shù)據(jù),請(qǐng)?jiān)诟袷轿募惺褂孟铝袛?shù)據(jù)類型之一:SQLCHAR或SQLVARYCHAR(數(shù)據(jù)以客戶端代碼頁(yè)或排序規(guī)則隱含的代碼頁(yè)的形式發(fā)送)、SQLNCHAR或SQLNVARCHAR(數(shù)據(jù)以Unicode的形式發(fā)送)或者SQLBINARY或SQLVARYBIN(數(shù)據(jù)不經(jīng)任何轉(zhuǎn)換直接發(fā)送)?!纠?1-19】本例說明了如何通過bcp命令和BULKINSERT、INSERT...SELECT*FROMOPENROWSET(BULK...)語句使用格式化文件大容量導(dǎo)入數(shù)據(jù)。運(yùn)行這些大容量導(dǎo)入示例前,都必須先創(chuàng)建示例表、數(shù)據(jù)文件和格式化文件。(1)創(chuàng)建示例表在架構(gòu)為dbo的tempdb數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為myTestFormatFiles的表。請(qǐng)?jiān)赟QLServerManagementStudio查詢編輯器中執(zhí)行以下語句:USE[tempdb]GOCREATETABLEmyTestFormatFiles(

Col1smallint,

Col2nvarchar(50),

Col3nvarchar(50),

Col4nvarchar(50)

);GO(2)創(chuàng)建示例數(shù)據(jù)文件myTestFormatFiles-c.Dat打開MicrosoftWindows自帶的【記事本】程序,輸入如下內(nèi)容:10,Field2,Field3,Field415,Field2,Field3,Field446,Field2,Field3,Field458,Field2,Field3,Field4然后另存為myTestFormatFiles-c.Dat,如圖11-7所示。圖11-7myTestFormatFiles-c.Dat注意,這里創(chuàng)建的文件myTestFormatFiles-c.Dat要存放到D:\DocumentsandSettings\Administrator\文件夾中。本例使用的有XML格式化文件myTestFormatFiles-f-x-c.Xml,和非XML格式化文件。這兩種格式化文件都使用字符數(shù)據(jù)格式和非默認(rèn)字段終止符(,)。(4)生成非XML格式化文件下面使用bcp基于myTestFormatFiles表生成一個(gè)XML格式文件myTestFormatFiles.Fmt,文件包含以下信息,如圖11-8所示。

圖11-8myTestFormatFiles.Fmt使用帶format選項(xiàng)的bcp語句創(chuàng)建此格式化文件,請(qǐng)?jiān)赪indows命令提示符下輸入以下內(nèi)容:bcptempdb..MyTestFormatFilesformatnul-c-t,-fmyTestFormatFiles.Fmt–T注意,創(chuàng)建的文件位于文件D:\DocumentsandSettings\Administrator\文件夾中。圖11-9Windows命令提示符窗口(5)生成XML格式化文件下面使用bcp進(jìn)行創(chuàng)建,以基于myTestFormatFiles表生成一個(gè)XML格式化文件myTestFormatFiles.Xml,文件包含以下信息,如圖11-10所示:圖11-10myTestFormatFiles.Xml使用帶format選項(xiàng)的bcp語句創(chuàng)建格式化文件myTestFormatFiles.Xml,請(qǐng)?jiān)赪indows命令提示符下輸入以下內(nèi)容,如圖11-11所示:bcptempdb..MyTestFormatFilesformatnul-c-t,-x-fmyTestFormatFiles.Xml–T注意,創(chuàng)建的文件位于文件D:\DocumentsandSettings\Administrator\文件夾中。圖11-11Windows命令提示符窗口(7)使用bcp導(dǎo)入文本文件到SQLServer數(shù)據(jù)庫(kù)表使用bcp將數(shù)據(jù)從myTestFormatFiles.Dat數(shù)據(jù)文件大容量導(dǎo)入到tempdbtempdb.myTestFormatFiles表中。此示例使用一個(gè)名為MyTestFormatFiles.Xml的XML格式化文件。此示例在導(dǎo)入數(shù)據(jù)文件之前刪除所有的現(xiàn)有表行。在Windows命令提示符下,輸入以下內(nèi)容:

bcptempdb..myTestFormatFilesinmyTestFormatFiles.Dat-fmyTestFormatFiles.Xml–T這里注意myTestFormatFiles-c.Dat和myTestFormatFiles.Xml文件都要位于如圖所示的D:\DocumentsandSettings\Administrator\文件夾中。圖11-12Windows命令提示符窗口在,可以看到數(shù)據(jù)已經(jīng)導(dǎo)入,如圖11-13所示。(8)使用BULKINSERT將文本文件數(shù)據(jù)導(dǎo)入到SQLServer數(shù)據(jù)庫(kù)表使用BULKINSERT將數(shù)據(jù)從myTestFormatFiles.Dat數(shù)據(jù)文件大容量導(dǎo)入到tempdb.myTestFormatFiles表中。此處使用的是非XML格式化文件MyTestFormatFiles.Fmt。此導(dǎo)入數(shù)據(jù)文件之前將刪除所有的現(xiàn)有表行。圖11-13查看導(dǎo)入窗口在SQLServerManagementStudio查詢編輯器中,如圖11-14所示,執(zhí)行以下語句:USEtempdb;GODELETEmyTestFormatFiles;GOBULKINSERTmyTestFormatFiles

FROM'D:\DocumentsandSettings\Administrator\myTestFormatFiles.Dat'

WITH(FORMATFILE='D:\DocumentsandSettings\Administrator\myTestFormatFiles.Fmt');GOSELECT*FROMmyTestFormatFiles;GO圖11-14SQLServerManagementStudio查詢編輯器(9)使用OPENROWSET大容量行集提供程序使用INSERT...SELECT*FROMOPENROWSET(BULK...)將數(shù)據(jù)從myTestFormatFiles.Dat數(shù)據(jù)文件大容量導(dǎo)入到tempdb示例數(shù)據(jù)庫(kù)的tempdb.myTestFormatFiles表中。此處使用一個(gè)名為MyTestFormatFiles.Xml的XML格式化文件。此示例在導(dǎo)入數(shù)據(jù)文件之前刪除所有的現(xiàn)有表行。在SQLServerManagementStudio查詢編輯器中,執(zhí)行以下語句:USEtempdb;DELETEmyTestFormatFiles;GOINSERTINTOmyTestFormatFiles

SELECT*

FROMOPENROWSET(BULK'D:\DocumentsandSettings\Administrator\myTestFormatFiles.Dat',

FORMATFILE='D:\DocumentsandSettings\Administrator\myTestFormatFiles.Xml'

)ast1;GOSELECT*FROMmyTestFormatFiles;GO用完示例表后,可以使用以下語句刪除該表:

DROPTABLEmyTestFormatFiles補(bǔ)充知識(shí):OLEDBOLEDB(ObjectLinkingandEmbedding,Database,對(duì)象鏈接嵌入數(shù)據(jù)庫(kù),也寫作OLEDB或OLE-DB),是微軟數(shù)據(jù)訪問組件(MDAC)的一部分,是微軟為以統(tǒng)一方式訪問不同類型的數(shù)據(jù)存儲(chǔ)設(shè)計(jì)的一種應(yīng)用程序接口,是一組用組件對(duì)象模型(COM)實(shí)現(xiàn)的接口,而與對(duì)象連接與嵌入(OLE)無關(guān)。以框架的方式相互作用,為程序員開發(fā)訪問幾乎任何數(shù)據(jù)存儲(chǔ)提供了一個(gè)統(tǒng)一并全面的方法。OLEDB的提供者可以用于提供像文本文件和電子表格一樣簡(jiǎn)單的非關(guān)系型數(shù)據(jù)存儲(chǔ)的訪問,也可以提供像Oracle、SQLServer和SybaseASE一樣復(fù)雜的關(guān)系型數(shù)據(jù)庫(kù)的訪問。OLEDB同樣可以提供對(duì)層次類型的數(shù)據(jù)存儲(chǔ)(如電子郵件系統(tǒng))的訪問。11.3圖形化導(dǎo)入導(dǎo)出數(shù)據(jù)向?qū)Ю肧QLServerManagementStudio的數(shù)據(jù)導(dǎo)入導(dǎo)出功能可以方便地將SQLServer中的表中的數(shù)據(jù)導(dǎo)出到.Txt、.xsl等文件中,也可將非SQLServer的數(shù)據(jù)導(dǎo)入到SQLServer數(shù)據(jù)庫(kù)中。下面以導(dǎo)出數(shù)據(jù)到.Txt文件為例演示數(shù)據(jù)的導(dǎo)出,步驟如下:Step1.啟動(dòng)SQLServerManagementStudio,如圖11-15,在【對(duì)象資源管理器】窗口中,右擊數(shù)據(jù)庫(kù)名【stu_info】,選擇【任務(wù)】,單擊【導(dǎo)出數(shù)據(jù)…】。圖11-15對(duì)象資源管理器Step2.如圖11-16,系統(tǒng)彈出【SQLServer導(dǎo)入和導(dǎo)出向?qū)А繉?duì)話框,單擊【下一步】按鈕。圖11-16SQLServer導(dǎo)入和導(dǎo)出向?qū)tep3.如圖11-17,在【SQLServer導(dǎo)入和導(dǎo)出向?qū)?選擇數(shù)據(jù)源】對(duì)話框中,【數(shù)據(jù)源】選擇【SQLServerNativeClient10.0】,【服務(wù)器名稱】選擇自己的SQLServer數(shù)據(jù)庫(kù)實(shí)例名,【身份驗(yàn)證】選擇【使用Windows身份驗(yàn)證】,【數(shù)據(jù)庫(kù)】選擇【stu_info】,單擊【下一步】按鈕。圖11-17SQLServer導(dǎo)入和導(dǎo)出向?qū)?選擇數(shù)據(jù)源Step4.如圖11-18,在【SQLServer導(dǎo)入和導(dǎo)出向?qū)?選擇目標(biāo)】對(duì)話框中,【目標(biāo)】選擇【平面文件目標(biāo)】,【文件名】輸入自己指定的名稱如“C:/score2.txt”,【區(qū)域設(shè)置】選擇【中文(中華人民共和國(guó))】,【代碼頁(yè)】、【格式】如圖所示,選中【在第一個(gè)數(shù)據(jù)行中顯示列名稱(A)】,單擊【下一步】按鈕。圖11-18SQLServer導(dǎo)入和導(dǎo)出向?qū)?選擇目標(biāo)Step5.如圖11-19,在【SQLServer導(dǎo)入和導(dǎo)出向?qū)?指定表復(fù)制或查詢】對(duì)話框中,選中【復(fù)制一個(gè)或多個(gè)表或視圖的數(shù)據(jù)】,單擊【下一步】按鈕。圖11-19SQLServer導(dǎo)入和導(dǎo)出向?qū)?指定表復(fù)制或查詢Step6.如圖11-20,在【SQLServer導(dǎo)入和導(dǎo)出向?qū)?配置平面文件目標(biāo)】對(duì)話框中,【源表或源視圖】選擇【[dbo].[score]】,單擊【下一步】按鈕。圖11-20SQLServer導(dǎo)入和導(dǎo)出向?qū)?配置平面文件目標(biāo)Step7.如圖11-21,在【SQLServer導(dǎo)入和導(dǎo)出向?qū)?運(yùn)行包】對(duì)話框中,選中【立即運(yùn)行】,單擊【下一步】按鈕。圖11-21SQLServer導(dǎo)入和導(dǎo)出向?qū)?運(yùn)行包Step8.如圖11-22,在【SQLServer導(dǎo)入和導(dǎo)出向?qū)?完成該向?qū)А繉?duì)話框中,單擊【完成】按鈕。圖11-22SQLServer導(dǎo)入和導(dǎo)出向?qū)?完成該向?qū)tep9.如圖11-23,在【SQLServer導(dǎo)入和導(dǎo)出向?qū)?執(zhí)行成功】對(duì)話框中,查看執(zhí)行成功顯示的【詳細(xì)信息】。圖11-23SQLServer導(dǎo)入和導(dǎo)出向?qū)?執(zhí)行成功Step10.查看導(dǎo)出的c:\score2.txt文件的內(nèi)容。11.4bcp實(shí)用工具語法格式批量數(shù)據(jù)導(dǎo)入導(dǎo)出工具BCP(BulkCopyProgram,BCP)能讓數(shù)據(jù)庫(kù)管理員將數(shù)據(jù)批量導(dǎo)入SQLServer表中或?qū)?shù)據(jù)從SQLServer表中批量導(dǎo)出文檔中。它還支持一些定義數(shù)據(jù)如何導(dǎo)出、導(dǎo)入到什么地方、加載哪些數(shù)據(jù)等選項(xiàng)。BCP實(shí)用工具可以在MicrosoftSQLServer實(shí)例和用戶指定格式的數(shù)據(jù)文件間大容量數(shù)據(jù)。BCP是SQLServer中負(fù)責(zé)導(dǎo)入導(dǎo)出數(shù)據(jù)的一個(gè)命令行工具,它是基于DB-Library的,并且能以并行的方式高效地導(dǎo)入導(dǎo)出大批量的數(shù)據(jù)。BCP可以將數(shù)據(jù)庫(kù)的表或視圖直接導(dǎo)出,也能通過SELECTFROM語句對(duì)表或視圖進(jìn)行過濾后導(dǎo)出。在導(dǎo)入導(dǎo)出數(shù)據(jù)時(shí),可以使用默認(rèn)值或是使用一個(gè)格式文件將文件中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)或?qū)?shù)據(jù)庫(kù)中的數(shù)據(jù)導(dǎo)出到文件中。下面將詳細(xì)討論如何利用BCP導(dǎo)入導(dǎo)出數(shù)據(jù)。1.BCP的主要參數(shù)介紹BCP共有四個(gè)動(dòng)作可以選擇。(1)導(dǎo)入。這個(gè)動(dòng)作使用in命令完成,后面跟需要導(dǎo)入的文件名。(2)導(dǎo)出。這個(gè)動(dòng)作使用out命令完成,后面跟需要導(dǎo)出的文件名。(3)使用SQL語句導(dǎo)出。這個(gè)動(dòng)作使用queryout命令完成,它跟out類似,只是數(shù)據(jù)源不是表或視圖名,而是SQL語句。(4)導(dǎo)出格式文件。這個(gè)動(dòng)作使用format命令完成,后而跟格式文件名。bcp語法格式如下:bcp{[[database_name.][schema].]{table_name|view_name}|"query"}

{in|out|queryout|format}data_file

[-mmax_errors][-fformat_file][-x][-eerr_file]

[-Ffirst_row][-Llast_row][-bbatch_size]

[-ddatabase_name][-n][-c][-N][-w][-V(70|80|90)]

[-q][-C{ACP|OEM|RAW|code_page}][-tfield_term]

[-rrow_term][-iinput_file][-ooutput_file][-apacket_size]

[-S[server_name[\instance_name]]][-Ulogin_id][-Ppassword]

[-T][-v][-R][-k][-E][-h"hint[,...n]"]下面介紹一些常用的選項(xiàng)的含義database_name指定的表或視圖所在數(shù)據(jù)庫(kù)的名稱。如果未指定,則使用用戶的默認(rèn)數(shù)據(jù)庫(kù)。owner表或視圖所有者的名稱。如果執(zhí)行該操作的用戶擁有指定的表或視圖,則owner是可選的。如果未指定owner,并且執(zhí)行該操作的用戶不是指定的表或視圖的所有者,則SQLServer將返回錯(cuò)誤消息,而且該操作將取消。table_name將數(shù)據(jù)導(dǎo)入SQLServer(in)時(shí)為目標(biāo)表名稱,將數(shù)據(jù)從SQLServer(out)導(dǎo)出時(shí)為源表名稱。view_name將數(shù)據(jù)導(dǎo)入到SQLServer(in)時(shí)為目標(biāo)視圖名稱,從SQLServer(out)中導(dǎo)出數(shù)據(jù)時(shí)為源視圖名稱。只有其中所有列都引用同一個(gè)表的視圖才能用作目標(biāo)視圖。"query"一個(gè)返回結(jié)果集的Transact-SQL查詢。如果該查詢返回多個(gè)結(jié)果集(如指定COMPUTE子句的SELECT語句),則只將第一個(gè)結(jié)果集到數(shù)據(jù)文件,而忽略后續(xù)的結(jié)果集。請(qǐng)將查詢放在英文雙引號(hào)中,將查詢中嵌入的任何內(nèi)容放在英文單引號(hào)中。從查詢中大容量數(shù)據(jù)時(shí),還必須指定queryout。只要在執(zhí)行bcp語句之前存儲(chǔ)過程內(nèi)引用的所有表均存在,查詢就可以引用該存儲(chǔ)過程。例如,如果存儲(chǔ)過程生成一個(gè)臨時(shí)表,則bcp語句便會(huì)失敗,因?yàn)樵撆R時(shí)表只在運(yùn)行時(shí)可用,而在語句執(zhí)行時(shí)不可用。在這種情況下,應(yīng)考慮將存儲(chǔ)過程的結(jié)果插入表中,然后使用bcp將數(shù)據(jù)從表到數(shù)據(jù)文件中。in|out|queryout|format指定大容量bcp的方向,具體如下:in從文件到數(shù)據(jù)庫(kù)表或視圖。out從數(shù)據(jù)庫(kù)表或視圖到文件。如果指定了現(xiàn)有文件,則該文件將被覆蓋。提取數(shù)據(jù)時(shí),請(qǐng)注意bcp實(shí)用工具將空字符串表示為null,而將null字符串表示為空字符串。queryout從查詢中,僅當(dāng)從查詢大容量數(shù)據(jù)時(shí)才必須指定此選項(xiàng)。format根據(jù)指定的選項(xiàng)(-n、-c、-w或-N)以及表或視圖的分隔符創(chuàng)建格式化文件。大容量數(shù)據(jù)時(shí),bcp命令可以引用一個(gè)格式化文件,從而避免以交互方式重復(fù)輸入格式信息。format選項(xiàng)要求指定-f選項(xiàng);創(chuàng)建XML格式化文件時(shí)還需要指定-x選項(xiàng)。有關(guān)詳細(xì)信息,請(qǐng)參閱創(chuàng)建格式化文件。data_file數(shù)據(jù)文件的完整路徑。將數(shù)據(jù)大容量導(dǎo)入SQLServer時(shí),數(shù)據(jù)文件將包含要到指定的表或視圖中的數(shù)據(jù)。從SQLServer中大容量導(dǎo)出數(shù)據(jù)時(shí),數(shù)據(jù)文件將包含從表或視圖中的數(shù)據(jù)。路徑可以有1到255個(gè)字符。數(shù)據(jù)文件最多可包含263-1行。-mmax_errors指定取消bcp操作之前可能出現(xiàn)的語法錯(cuò)誤的最大數(shù)目。語法錯(cuò)誤是指將數(shù)據(jù)轉(zhuǎn)換為目標(biāo)數(shù)據(jù)類型時(shí)的錯(cuò)誤。max_errors總數(shù)不包括只能在服務(wù)器中檢測(cè)到的錯(cuò)誤,如違反約束。無法由bcp實(shí)用工具的行將被忽略,并計(jì)為一個(gè)錯(cuò)誤。如果未包括此選項(xiàng),則默認(rèn)值為10。注意,-m選項(xiàng)也不適用于轉(zhuǎn)換money或bigint數(shù)據(jù)類型。-fformat_file指定格式化文件的完整路徑。此選項(xiàng)的含義取決于使用它的環(huán)境,具體如下:如果-f與format選項(xiàng)一起使用,則將為指定的表或視圖創(chuàng)建指定的format_file。若要?jiǎng)?chuàng)建XML格式化文件,請(qǐng)同時(shí)指定-x選項(xiàng)。如果與in或out選項(xiàng)一起使用,則-f需要一個(gè)現(xiàn)有的格式化文件。如果format_file以連字符(-)或正斜杠(/)開頭,則不要在-f與format_file名稱之間包含空格。-x與format和-fformat_file選項(xiàng)一起使用,可以生成基于XML的格式化文件,而不是默認(rèn)的非XML格式化文件。在導(dǎo)入或?qū)С鰯?shù)據(jù)時(shí),-x不起作用。如果不與format和-fformat_file一起使用,則將生成錯(cuò)誤。-eerr_file指定錯(cuò)誤文件的完整路徑,此文件用于存儲(chǔ)bcp實(shí)用工具無法從文件傳輸?shù)綌?shù)據(jù)庫(kù)的所有行。bcp命令產(chǎn)生的錯(cuò)誤消息將被發(fā)送到用戶的工作站。如果不使用此選項(xiàng),則不會(huì)創(chuàng)建錯(cuò)誤文件。如果err_file以連字符(-)或正斜杠(/)開頭,則不要在-e與err_file名稱之間包含空格。-Ffirst_row指定要從表中導(dǎo)出或從數(shù)據(jù)文件導(dǎo)入的第一行的編號(hào)。此參數(shù)的值應(yīng)大于(>)0,小于(<)或等于(=)總行數(shù)。如果未指定此參數(shù),則默認(rèn)為文件的第一行。first_row可以是一個(gè)最大為2^63-1的正整數(shù)值。-Ffirst_row從1開始。-Llast_row指定要從表中導(dǎo)出或從數(shù)據(jù)文件中導(dǎo)入的最后一行的編號(hào)。此參數(shù)的值應(yīng)大于(>)0,小于(<)或等于(=)最后一行的編號(hào)。如果未指定此參數(shù),則默認(rèn)為文件的最后一行。last_row可以是一個(gè)最大為2^63-1的正整數(shù)值。-bbatch_size指定每批導(dǎo)入數(shù)據(jù)的行數(shù)。每個(gè)批次均作為一個(gè)單獨(dú)的事務(wù)進(jìn)行導(dǎo)入并記錄,在提交之前會(huì)導(dǎo)入整批。默認(rèn)情況下,數(shù)據(jù)文件中的所有行均作為一個(gè)批次導(dǎo)入。若要將行分為多個(gè)批次進(jìn)行操作,請(qǐng)指定小于數(shù)據(jù)文件中的行數(shù)的batch_size。如果任何批次的事務(wù)失敗,則將只回滾當(dāng)前批次中的插入。已經(jīng)由已提交事務(wù)導(dǎo)入的批次不會(huì)受到將來失敗的影響。請(qǐng)不要將此選項(xiàng)與-h"ROWS_PER_BATCH=bb"選項(xiàng)一起使用。-ddatabase_name指定要連接到的數(shù)據(jù)庫(kù)。默認(rèn)情況下,bcp.exe連接到用戶的默認(rèn)數(shù)據(jù)庫(kù)。如果指定了-ddatabase_name以及一個(gè)由三個(gè)部分組成的名稱(database_name.schema.table,作為第一個(gè)參數(shù)傳遞給bcp.exe),將發(fā)生錯(cuò)誤。這是因?yàn)槟鸁o法兩次指定此數(shù)據(jù)庫(kù)名稱。如果database_name以連字符(-)或正斜杠(/)開頭,則不要在-d與數(shù)據(jù)庫(kù)名稱之間添加空格。-n使用數(shù)據(jù)的本機(jī)(數(shù)據(jù)庫(kù))數(shù)據(jù)類型執(zhí)行大容量操作。此選項(xiàng)不提示輸入每個(gè)字段,它將使用本機(jī)值。-c使用字符數(shù)據(jù)類型執(zhí)行該操作。此選項(xiàng)不提示輸入每個(gè)字段;它使用char作為存儲(chǔ)類型,不帶前綴;使用\t

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論