SQL批量上传/复制,格式文件错误

时间:2019-04-09 15:42:30

标签: sql sql-server sqlbulkcopy

所以,我有一个具有以下结构的表;

CREATE TABLE [dbo].[LoadAgencyInfo](
       [Agency] [varchar](4) NULL,
       [Fund] [varchar](1) NULL,
       [Account] [varchar](14) NULL,
       [LName] [varchar](20) NULL,
       [FName] [varchar](9) NULL,
       [SSN] [varchar](9) NULL,
       [Prior] [varchar](3) NULL,
       [BalDue] [varchar](8) NULL,
       [DRSBal] [varchar](8) NULL,
       [Fill1] [varchar](16) NULL,
       [FileDate] [varchar](6) NULL,
       [Fill2] [varchar](3) NULL,
       [P1] [varchar](2) NULL,
       [P2] [varchar](2) NULL
) ON [PRIMARY]
GO

然后我有一个平面文件,打算将其批量上传到数据库。文件格式如下,只是普通的文本文件,请参见下文;有几个不同的文件,但是它们都遵循这种格式。

样本数据

2000S10000252      VYUSBN              RUDXOD   0099882260000006824100000000                181802      
2300S20000350      TEVXXXX             TGXC     0025045640000000652800000000                052153      

根据字符长度,文件应遵循以下格式。每个单元格应根据文件/记录中字符的位置填充正确的信息。宽度为零的记录应填充零。带有跳过此字段的记录应跳过特定字段,并且不要将任何数据放入单元格中。

文件崩溃

Field Name
Character Start
Character End
Width
Agency
1
4
4
Fund
5
5
1
Account
6
19
14
LName
20
39
20
FName
40
48
9
SSN
49
57
9
Prior
58
60
3 (Zero fill, doesn’t come from text file default to 000)
BalDue
61
68
8
DrsBal
69
76
8 (Zero fill, doesn’t come from text file default to 00000000)
Fill1
77
92
16 (Skip this field)
FileDate
93
98
6
Fill2
99
105
7 (skip this field)

平面文件在字符长度方面应该遵循严格的准则,例如前四个字符属于代理单元,下一个字符属于基金单元,等等。请注意,没有任何定界字符,所以我我正在使用SQL格式的文件来帮助处理记录并将其输入数据库。但是,无论我做什么,都不会填充或部分填充适当的单元格,并且当我尝试跳过字段时,将填充要跳过的字段。我尝试将数据类型更改为nvarchar,但仍然无法正常工作。有时数据会乱码,无法正确转换。

请参阅下面的格式文件;

<?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="CharFixed" MAX_LENGTH="4" />
       <FIELD ID="2" xsi:type="CharFixed" MAX_LENGTH="1"/>
       <FIELD ID="3" xsi:type="CharFixed" MAX_LENGTH="14"/>
       <FIELD ID="4" xsi:type="CharFixed" MAX_LENGTH="20"/>
       <FIELD ID="5" xsi:type="CharFixed" MAX_LENGTH="9"/>
       <FIELD ID="6" xsi:type="CharFixed" MAX_LENGTH="9"/>
       <FIELD ID="7" xsi:type="CharFixed" MAX_LENGTH="3"/>
       <FIELD ID="8" xsi:type="CharFixed" MAX_LENGTH="8"/>
       <FIELD ID="9" xsi:type="CharFixed" MAX_LENGTH="8"/>
</RECORD>
<ROW>
       <COLUMN SOURCE="1" NAME="Agency" xsi:type="SQLINT" LENGTH="4"/>
       <COLUMN SOURCE="2" NAME="Fund" xsi:type="SQLNVARCHAR" LENGTH="1"/>
       <COLUMN SOURCE="3" NAME="Account" xsi:type="SQLNVARCHAR" LENGTH="14"/>
       <COLUMN SOURCE="4" NAME="LName" xsi:type="SQLNVARCHAR" LENGTH="20"/>
       <COLUMN SOURCE="5" NAME="FName" xsi:type="SQLNVARCHAR" LENGTH="9"/>
       <COLUMN SOURCE="6" NAME="SSN" xsi:type="SQLINT" LENGTH="9"/>
       <COLUMN SOURCE="7" NAME="Prior" xsi:type="SQLINT" LENGTH="3"/>
       <COLUMN SOURCE="8" NAME="BalDue" xsi:type="SQLINT" LENGTH="8"/>
       <COLUMN SOURCE="9" NAME="DRSBal" xsi:type="SQLINT" LENGTH="8"/>
</ROW>
</BCPFORMAT>

任何有关为何无法正常工作的帮助将非常有益

1 个答案:

答案 0 :(得分:0)

因此,我对SQL格式的xml文件和SQL命令本身进行了一些调整,如下所示。现在的问题是,当我运行命令时,所有适当的字段都会被填充,但是第一行的最后一个单元格将获取所有后续行的数据,因为有2000多个行。应该发生的是,FileDate字段中的第六个字符之后,数据应移至下一行,而不是将所有后续行都放在FileDate字段中。我尝试用0x0a,'n,'r,'r'n,'n'r更新ROWTERMINATOR字段,但似乎没有任何作用。我还对命令为何不遵循MAX_LENGTH属性(设置为6)以及为什么行终止符都不起作用感到困惑?我已经待了好几天了,这让我发狂。

源文件是来自UNIX机器的计划文本,并且只有lf作为行终止符。我无法发布数据图片,因为我没有10个代表点。

XML File
<?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="CharFixed" LENGTH="4" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="2" xsi:type="CharFixed" LENGTH="1" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharFixed" LENGTH="14" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="CharFixed" LENGTH="20" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="5" xsi:type="CharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="6" xsi:type="CharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="7" xsi:type="CharFixed" LENGTH="3" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="8" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="9" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="10" xsi:type="CharFixed" LENGTH="16" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="11" xsi:type="CharTerm" MAX_LENGTH='6' TERMINATOR="0x0a" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Agency" xsi:type="SQLCHAR" />
<COLUMN SOURCE="2" NAME="Fund" xsi:type="SQLCHAR" />
<COLUMN SOURCE="3" NAME="Account" xsi:type="SQLCHAR" />
<COLUMN SOURCE="4" NAME="LName" xsi:type="SQLCHAR" />
<COLUMN SOURCE="5" NAME="FName" xsi:type="SQLCHAR" />
<COLUMN SOURCE="6" NAME="SSN" xsi:type="SQLCHAR" />
<COLUMN SOURCE="7" NAME="Prior" xsi:type="SQLCHAR" />
<COLUMN SOURCE="8" NAME="BalDue" xsi:type="SQLCHAR" />
<COLUMN SOURCE="9" NAME="DRSBal" xsi:type="SQLCHAR" />
<COLUMN SOURCE="10" NAME="Fill1" xsi:type="SQLCHAR" />
<COLUMN SOURCE="11" NAME="FileDate" xsi:type="SQLNCHAR" />
</ROW>
</BCPFORMAT>