SQL Server Bulk Insert 只需要部分字段時(shí)的方法
更新時(shí)間:2011年10月07日 00:19:37 作者:
上午在找Bulk Insert的資料看,還轉(zhuǎn)了一篇。不巧今天下午就用上了,我遇到的需求是導(dǎo)出表A中的N個(gè)字段,然后導(dǎo)入到表B的N個(gè)字段當(dāng)中。
根據(jù)一般做法的話,導(dǎo)出部分字段時(shí)沒(méi)有辦法生成格式化XML文件,所以導(dǎo)入時(shí)就沒(méi)有辦法格式化導(dǎo)入數(shù)據(jù)。
我想到兩點(diǎn),1.手工修改格式化XML文件,2.創(chuàng)造一個(gè)能生成格式化XML文件的中間對(duì)象。
在MSDN中尋找方法時(shí),突然想到可以使用視圖來(lái)做中間對(duì)象,于是就搭一個(gè)測(cè)試下。以下是測(cè)試記錄:
USE master
GO
CREATE DATABASE [db_test]
GO
USE db_test
GO
CREATE TABLE dbo.T_test(
ID [int] IDENTITY(1,1) NOT NULL,
Code varchar(10) ,
Name varchar(100) ,
Memo nvarchar(500) ,
Memo2 ntext ,
PRIMARY KEY (ID)
)
GO
--上面創(chuàng)建的表是源數(shù)據(jù)表,下面創(chuàng)建是要導(dǎo)入數(shù)據(jù)的表,只有源表的三個(gè)字段
Select Code, Name,Memo into dbo.T_test2 from dbo.T_test Where 1=2
--需求就是把表T_test中的Code,Name導(dǎo)入到T_test2。
--接下來(lái),就是生成導(dǎo)入目標(biāo)表的格式化XML文件,可是MSDN上說(shuō)只能生成某個(gè)對(duì)象的格式化XML文件。
--只好建立一個(gè)中間對(duì)象來(lái)達(dá)到目的,這里我創(chuàng)建的是一個(gè)視圖。
--視圖只包含需要導(dǎo)入的字段
Create View v_test
AS
Select Code,Name From dbo.T_test2
--然后就是BCP操作
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;
GO
EXEC master..xp_cmdshell 'BCP db_test.dbo.v_test format nul -f C:/v_test_fmt.xml -x -c -T -S MyPC\MyDB'
GO
EXEC master..xp_cmdshell 'BCP "select Code, Name from db_test.dbo.T_test" queryout C:/t_test.data -f C:/v_test_fmt.xml -T -S MyPC\MyDB'
GO
--格式化文件和數(shù)據(jù)文件都有了,就成了.
BULK INSERT db_mgr.dbo.v_t1
FROM N'C:/t_test.data'
WITH
(
FORMATFILE = N'C:/v_test_fmt.xml'
)
GO
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0;
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;
GO
Drop Database db_test
GO
環(huán)境是sql2005。
我想到兩點(diǎn),1.手工修改格式化XML文件,2.創(chuàng)造一個(gè)能生成格式化XML文件的中間對(duì)象。
在MSDN中尋找方法時(shí),突然想到可以使用視圖來(lái)做中間對(duì)象,于是就搭一個(gè)測(cè)試下。以下是測(cè)試記錄:
復(fù)制代碼 代碼如下:
USE master
GO
CREATE DATABASE [db_test]
GO
USE db_test
GO
CREATE TABLE dbo.T_test(
ID [int] IDENTITY(1,1) NOT NULL,
Code varchar(10) ,
Name varchar(100) ,
Memo nvarchar(500) ,
Memo2 ntext ,
PRIMARY KEY (ID)
)
GO
--上面創(chuàng)建的表是源數(shù)據(jù)表,下面創(chuàng)建是要導(dǎo)入數(shù)據(jù)的表,只有源表的三個(gè)字段
Select Code, Name,Memo into dbo.T_test2 from dbo.T_test Where 1=2
--需求就是把表T_test中的Code,Name導(dǎo)入到T_test2。
--接下來(lái),就是生成導(dǎo)入目標(biāo)表的格式化XML文件,可是MSDN上說(shuō)只能生成某個(gè)對(duì)象的格式化XML文件。
--只好建立一個(gè)中間對(duì)象來(lái)達(dá)到目的,這里我創(chuàng)建的是一個(gè)視圖。
--視圖只包含需要導(dǎo)入的字段
Create View v_test
AS
Select Code,Name From dbo.T_test2
--然后就是BCP操作
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;
GO
EXEC master..xp_cmdshell 'BCP db_test.dbo.v_test format nul -f C:/v_test_fmt.xml -x -c -T -S MyPC\MyDB'
GO
EXEC master..xp_cmdshell 'BCP "select Code, Name from db_test.dbo.T_test" queryout C:/t_test.data -f C:/v_test_fmt.xml -T -S MyPC\MyDB'
GO
--格式化文件和數(shù)據(jù)文件都有了,就成了.
BULK INSERT db_mgr.dbo.v_t1
FROM N'C:/t_test.data'
WITH
(
FORMATFILE = N'C:/v_test_fmt.xml'
)
GO
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0;
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;
GO
Drop Database db_test
GO
環(huán)境是sql2005。
相關(guān)文章
數(shù)據(jù)庫(kù)性能優(yōu)化三:程序操作優(yōu)化提升性能
程序訪問(wèn)優(yōu)化也可以認(rèn)為是訪問(wèn)SQL語(yǔ)句的優(yōu)化,一個(gè)好的SQL語(yǔ)句是可以減少非常多的程序性能的,下面列出常用錯(cuò)誤習(xí)慣,并且提出相應(yīng)的解決方案2013-01-01
SQL Server數(shù)據(jù)庫(kù)中批量導(dǎo)入數(shù)據(jù)的2種方法
數(shù)據(jù)導(dǎo)入一直是項(xiàng)目人員比較頭疼的問(wèn)題。其實(shí),在SQL Server中集成了很多成批導(dǎo)入數(shù)據(jù)的方法,接下來(lái)為大家介紹下常用的四種批量導(dǎo)入數(shù)據(jù)的方法,感興趣的各位可以參考下哈2015-09-09
SQL Server中T-SQL 數(shù)據(jù)類型轉(zhuǎn)換詳解
T-SQL提供了兩個(gè)顯示轉(zhuǎn)換的函數(shù):CAST函數(shù)和CONVERT函數(shù)。今天我們就來(lái)相信探討下2018-02-02
SQL Server 排序函數(shù) ROW_NUMBER和RANK 用法總結(jié)
下面的例子和SQL語(yǔ)句均在SQL Server 2008環(huán)境下運(yùn)行通過(guò),使用SQL Server自帶的AdventureWorks數(shù)據(jù)庫(kù)。2009-07-07
SQL為什么不建議執(zhí)行超過(guò)3表以上的多表關(guān)聯(lián)查詢
mysql是往簡(jiǎn)單化方向去設(shè)計(jì)的,如果多個(gè)表關(guān)聯(lián)查詢(超過(guò)3張表)效率上是比不上PG的,本文就詳細(xì)的介紹一下原因,感興趣的可以了解一下2022-03-03
sqlserver 用戶權(quán)限管理,LINQ去除它的重復(fù)菜單項(xiàng)
事情是這樣的,我有三張表,用戶_角色關(guān)系表User_Role,角色_菜單關(guān)系表Role_Menu和菜單表2011-08-08
數(shù)據(jù)庫(kù)中identity字段不必是系統(tǒng)產(chǎn)生的唯一值 性能優(yōu)化方法(新招)
具有identity特性的字段,其值是系統(tǒng)產(chǎn)生的,自動(dòng)增加的,所以,一般把這個(gè)用在一個(gè)表的主鍵上。2011-09-09

