现在的位置: 首页 > 综合 > 正文

如何让BCP导入与目标表格式不一致的数据

2017年10月05日 ⁄ 综合 ⁄ 共 1561字 ⁄ 字号 评论关闭

说明:
我有两个客户数据库,一个中心库,现在需要将两个客户库的[UserActive_Log]的数据上传到中心库统计,3个数据库的表结构都是一样的,但是导入到中心库时,自增长列不能导入,因为2个客户数据库ID会出现重复的
表结构如下:

CREATE TABLE [dbo].[UserActive_Log](
    
[id] [int] IDENTITY(1,1NOT NULL,
    
[UserId] [int] NOT NULL,
    
[IP] [varchar](16NOT NULL  DEFAULT (''),
    
[WriteTime] [datetime] NOT NULL DEFAULT (getdate())
ON [PRIMARY]

我现在操作如下
1 创建BCP导入格式文件
在DOS下执行
bcp "[CMS_Log].[dbo].[UserActive_Log]" format nul -fd:/Bcp.fmt -c -T -S127.0.0.1
说明: 使用format和-f参数 生成"[CMS_Log].[dbo].[UserActive_Log]" 使用-c格式的BCP格式文件,对于输出数据文件,使用NUL表示空设备响应

d:/Bcp.fmt内容如下
9.0
4
1       SQLCHAR       0       12      "/t"     1     id                     ""
2       SQLCHAR       0       12      "/t"     2     UserId                 ""
3       SQLCHAR       0       16      "/t"     3     IP                     Chinese_PRC_CI_AS
4       SQLCHAR       0       24      "/r/n"   4     WriteTime              ""

2 编辑d:/Bcp.fmt,将第1列数据改为空值,编辑后内容如下
9.0
4
1       SQLCHAR       0       0       ""       0     Id                     ""
2       SQLCHAR       0       12      "/t"     2     UserId                 ""
3       SQLCHAR       0       16      "/t"     3     IP                     Chinese_PRC_CI_AS
4       SQLCHAR       0       24      "/r/n"   4     WriteTime              ""

3 导出数据,并删除源数据,注意,我只导出了3列
bcp "DELETE [CMS_Log].[dbo].[UserActive_Log] OUTPUT deleted.[UserId] , deleted.[IP] , deleted.[WriteTime] FROM [CMS_Log].[dbo].[UserActive_Log]" format d:/database/dayBackup/20080513/_第一次进入服务器用户日志.txt -c -S127.0.0.1 -T
说明:使用SQL2005的新语法OUTPUT,删除表数据,并且将影响的行输出,这里忽略了第一列自增长,因为合并时不需要.

4 导入到目标数据库
bcp [CMS_Centor_Log].dbo.UserActive_Log in d:/data.txt -fd:/bcp.fmt -T -S127.0.0.1
这样就可以将3列导入到目标表的4个列中

抱歉!评论已关闭.