Sql server SQL Server大容量插入固定长度字符数据

Sql server SQL Server大容量插入固定长度字符数据,sql-server,bulkinsert,bcp,Sql Server,Bulkinsert,Bcp,我使用SQLServer2008,有一个包含5个字符类型列的表 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=

我使用SQLServer2008,有一个包含5个字符类型列的表

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>

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

两步方法如何?首先将数据作为“大行”加载到暂存表中,然后使用第二个查询将原始行拆分为相应的字段,并相应地处理缺少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对堆表也不太感兴趣,因此有它是一件好事[Tm]

如果这是唯一可用的解决方案,那么哪种方法更有效,使用SQLServer解析这些字符值,或者编写一个c windows应用程序,并让它逐行解析读取文件,解析和插入行。我试图总结一下情况,事实上,目标表有35列,最后6列可能是空的。数据文件有60行数据。我将每5分钟有一个新的数据文件。如果你只需要大约60行数据,我不会太担心性能。虽然SQL在字符串操作方面可能不太擅长什么是语言,但它在IMHO方面做得不错。但是为35列编写语句并不有趣=P
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]