博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使用带有较少字段的数据文件

Posted on 2010-02-23 09:25  大椰网吧  阅读(173)  评论(0编辑  收藏  举报

使用带有较少字段的数据文件

在某些情况下,数据文件包含的字段数可能少于表中的列数。例如,New_auth.dat 数据文件(ASCII 格式,即字符格式)不包含与 authors2 表中 addresszip 列匹配的字段。

New_auth.dat 文件的内容如下:

777-77-7777,Smith,Chris,303 555-1213,Denver,CO,1
888-88-8888,Doe,John,206 555-1214,Seattle,WA,0
999-99-9999,Door,Jane,406 555-1234,Bozeman,MT,1

若要将数据有选择地大容量复制到 authors2 的适当列中,请使用以下命令创建默认的格式文件(Authors.fmt):

bcp pubs..authors2 out c:\authors.txt -Sservername -Usa -Ppassword

bcp 实用工具将提示输入 authors2 中每一列的文件存储类型、前缀长度、字段长度和字段终止符。每列的字段终止符均应为逗号 (,),但 contract 列除外,该列应使用行终止符 \n(换行符),因为该列是行中的最后一列。另外,因为该数据文件为 ASCII 文件,所以 contract 列的文件存储类型是 charaddresszip 列不应有字段终止符,并且应将其字段长度设置为 0。在提示输入格式文件名时,请指定 Authors.fmt。

Authors.fmt 文件的内容如下:

8.0
9
1  SQLCHAR  0  11 ","      1  au_id       SQL_Latin1_General_Cp437_BIN
2  SQLCHAR  0  40 ","      2  au_lname    SQL_Latin1_General_Cp437_BIN
3  SQLCHAR  0  20 ","      3  au_fname    SQL_Latin1_General_Cp437_BIN
4  SQLCHAR  0  12 ","      4  phone       SQL_Latin1_General_Cp437_BIN
5  SQLCHAR  0  0  ""       5  address     SQL_Latin1_General_Cp437_BIN
6  SQLCHAR  0  20 ","      6  city        SQL_Latin1_General_Cp437_BIN
7  SQLCHAR  0  2  ","      7  state       SQL_Latin1_General_Cp437_BIN
8  SQLCHAR  0  0  ""       8  zip         SQL_Latin1_General_Cp437_BIN
9  SQLCHAR  0  1  "\r\n"   9  contract    SQL_Latin1_General_Cp437_BIN

该格式文件包含将数据从数据文件大容量复制到 Microsoft® SQL Server™ 表所需的全部信息。addresszip 的前缀长度为 0、字段长度为 0 且没有字段终止符,这表明数据文件中不存在这两列。但是,必须使用文本编辑器进一步修改格式文件,以确保不会将任何数据装载到 addresszip 中。这两列的服务器列号(格式文件中的第六个字段)应为 0:

8.0
9
1  SQLCHAR  0  11 ","      1  au_id       SQL_Latin1_General_Cp437_BIN
2  SQLCHAR  0  40 ","      2  au_lname    SQL_Latin1_General_Cp437_BIN
3  SQLCHAR  0  20 ","      3  au_fname    SQL_Latin1_General_Cp437_BIN
4  SQLCHAR  0  12 ","      4  phone       SQL_Latin1_General_Cp437_BIN
5  SQLCHAR  0  0  ""       0  address     SQL_Latin1_General_Cp437_BIN
6  SQLCHAR  0  20 ","      6  city        SQL_Latin1_General_Cp437_BIN
7  SQLCHAR  0  2  ","      7  state       SQL_Latin1_General_Cp437_BIN
8  SQLCHAR  0  0  ""       0  zip         SQL_Latin1_General_Cp437_BIN
9  SQLCHAR  0  1  "\r\n"   9  contract    SQL_Latin1_General_Cp437_BIN

现在若要将该数据文件中的数据大容量复制到 authors2 中,可以使用以下命令:

bcp pubs..authors2 in c:\new_auth.dat -fc:\authors.fmt -Sservername -Usa -Ppassword

另外,也可以在 SQL 查询分析器这样的查询工具中使用 BULK INSERT 语句来大容量复制数据:

BULK INSERT pubs..authors2 FROM 'c:\new_auth.dat' 
WITH (FORMATFILE = 'c:\authors.fmt')

说明  因为数据文件中没有 addresszip 列,所以如果没有定义 DEFAULT 值,则 SQL Server 表中的这两列将包含 NULL。因此,authors2 必须允许这两列中包含空值。