SQL Server BULK INSERT固定长度的char数据

时间:2012-04-01 23:07:13

标签: sql-server bulkinsert bcp

我使用SQL Server 2008并拥有一个包含5个char类型列的表。

CREATE TABLE [dbo].[deviceDataBulk](
[f1] [char](9) NULL,
[f2] [char](5) NULL,
[f3] [char](7) NULL,
[f4] [char](7) NULL,
[f5] [char](6) NULL)

我还有一个bcp格式文件;

<RECORD>
 <FIELD ID="1" xsi:type="CharFixed" LENGTH="9" COLLATION="Turkish_CI_AS"/>
 <FIELD ID="2" xsi:type="CharFixed" LENGTH="5" COLLATION="Turkish_CI_AS"/>
 <FIELD ID="3" xsi:type="CharFixed" LENGTH="7" COLLATION="Turkish_CI_AS"/>
 <FIELD ID="4" xsi:type="CharFixed" LENGTH="7" COLLATION="Turkish_CI_AS"/>
 <FIELD ID="5" xsi:type="CharFixed" LENGTH="6" COLLATION="Turkish_CI_AS"/>
</RECORD>
<ROW>
 <COLUMN SOURCE="1" NAME="f1" NULLABLE="YES" xsi:type="SQLCHAR"/>
 <COLUMN SOURCE="2" NAME="f2" NULLABLE="YES" xsi:type="SQLCHAR"/>
 <COLUMN SOURCE="3" NAME="f3" NULLABLE="YES" xsi:type="SQLCHAR"/>
 <COLUMN SOURCE="4" NAME="f4" NULLABLE="YES" xsi:type="SQLCHAR"/>
 <COLUMN SOURCE="5" NAME="f5" NULLABLE="YES" xsi:type="SQLCHAR"/>
</ROW>

我的数据文件包含固定长度的char数据,每行中没有字段终止符。因此,整行将是34个字符。

我的问题是字段4,每行可能不存在字段5。我可能在该文件中有21个字符的长行或28个字符的长行。

不存在字段5存在而字段4不存在的情况。

文本文件的可能方案是;

f1 f2 f3 f4 f5
f1 f2 f3 f4
f1 f2 f3

我无法使用BULK INSERT插入此文件。我希望BULK INSERT在没有这些字段时插入空值,如果工具到达行尾,只需为其余字段插入空值。

1 个答案:

答案 0 :(得分:0)

两步法怎么样?首先将数据作为“大行”加载到临时表中,然后使用第二个查询将原始行拆分为相应的字段并相应地处理“缺少f5和/或f4列”的情况?

看起来(或多或少)像这样:(未经测试!)

CREATE TABLE [dbo].[deviceDataBulk_staging](
 [rowid] int IDENTITY(1 , 1) PRIMARY KEY,
 [raw] [varchar](34) NOT NULL)

GO
BULK INSERT [deviceDataBulk_staging]
FROM '<your file>' 
-- not sure if you really need a format-file here, 
-- simply make sure to pass the correct line-separator if it is 'exotic'.

GO

INSERT [deviceDataBulk] (f1, f2, f3, f4, f5)
SELECT f1 = SubString([raw], 1 , 9),
       f1 = SubString([raw], 10 , 5),
       f1 = SubString([raw], 15 , 7),
       f1 = (CASE WHEN Length([raw] < 22 THEN NULL ELSE SubString([raw], 22 , 7) END),
       f1 = (CASE WHEN Length([raw] < 29 THEN NULL ELSE SubString([raw], 29 , 6) END)
  FROM [deviceDataBulk_staging]
 ORDER BY [rowid]

暂存文件将如下所示:

[rowid]是为了保持顺序与文件中最初的顺序相同,你可能不需要它,但恕我直言,开销很小,而且MSSQL对HEAP表也不太热衷,因此有它“好东西[Tm]“