bcp:将列替换为数据字段中的值为null

时间:2015-07-06 21:49:02

标签: sql-server bulkinsert bcp

我们说我有一张桌子

CREATE TABLE [T1](
   [ID] [int] NOT NULL,
   [Level] [int] NULL,
   [N1] [int] NULL,
   [N2] [int] NULL)

我有一个由四个分隔字段组成的文件

 1,2,3,4
 2,a,5,8
 3,X,11,12
 ...

文件很大(数十或数亿行) 我正在使用bcp实用程序导入它。显然,第二个字段不是整数,但对于我的应用程序来说并不重要。所以我想将它导入到这个表中,跳过第二个字段。我无法更改文件格式或数据库架构。我有以下bcp格式文件

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t"/>
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\t"/>
  <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\n"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="ID" xsi:type="SQLINT"/>
  <COLUMN SOURCE="2" NAME="Level" xsi:type="SQLINT"/>
  <COLUMN SOURCE="3" NAME="N1" xsi:type="SQLINT"/>
  <COLUMN SOURCE="4" NAME="N2" xsi:type="SQLINT"/>
 </ROW>
</BCPFORMAT>

问题是:如何指定而不是字段2我希望第2列只是NULL?换句话说,我怎样才能指示bcp跳过一列?如果我只是删除

<COLUMN SOURCE="2" ...

比所有列都移位而第2列用来自字段3的数据填充,第3列填充来自字段4的值,第4列留空。 另一种方法是将此列设置为某个固定值,例如,每行为0。

2 个答案:

答案 0 :(得分:1)

所以,根据文档:如果你想跳过除最后一列之外的任何一列你需要创建一个暴露你想要导入的列子集的视图。

视图应该看起来像create view v1 as select id, n1, n2 from t1,然后您可以从格式文件中删除<COLUMN SOURCE="2" NAME="Level" xsi:type="SQLINT"/>并使用视图作为目标进行导入。

如果要为缺失列设置默认值,则应在导入之前为该列添加默认约束。

有关参考资料,请参阅: Using a Format File to Skip a Table ColumnUsing a Format File to Skip a Data Field

答案 1 :(得分:1)

除了@ jpw的回复,你能试试OPENROWSET吗?以下是BOL的样本 - Use a Format File to Map Table Columns to Data-File Fields。只需用NULL替换任何列。老实说,我不知道这是否有效,但请试一试:)

USE AdventureWorks2012;
GO
INSERT INTO myTestOrder 
  SELECT Col1, Col2, Col3, Col4
      FROM  OPENROWSET(BULK  'C:\myTestOrder-c.txt',
      FORMATFILE='C:\myTestOrder.Xml'  
       ) AS t1;
GO