12

这是完整的错误:

消息 4864,级别 16,状态 1,第 3 行第 1 行第 5 列 (FK_User_CreatedBy) 的批量加载数据转换错误(指定代码页的类型不匹配或无效字符)。

这是我痛苦的存在快照:)

在此处输入图像描述

许多问题都涉及这些问题,但没有一个能解决问题……

我怀疑我的问题与此处描述的类似,但我不确定。未正确跳过的目标表列不是稀疏的。

在此处输入图像描述

这是在记事本和记事本++中打开的用于导入 (.csv) 的两行数据文件:(是的,我知道行终止符是 \r\n 而字段/列终止符是 \t 或 ',')

在此处输入图像描述

这是纯文本:

1,fArty,Padul,1,10/1/1962,Head of ,Australia,AU Talavera Centre,NSW,7 CSU,farty.randy@gummibaer.com
2,mifsm,Jodel,1,10/1/1970,Chief Officer,Australia,AU ,NSW,8 CSU,midsm@gummibaer.com

CONTEXT/BACKGROUND: 在小表和输入文件上进行测试,记录很少(请记住,这是在具有许多列的表上跳过列,最终会受到伤害)......

导入非常适用于如下所示的小型数据库表:

在此处输入图像描述

并且是这样创建的:

在此处输入图像描述

下面是创建表的代码:

    DROP TABLE dbo.tbl_Person_Importtest

CREATE TABLE dbo.tbl_Person_Importtest 
(
ID int PRIMARY KEY NOT NULL,
LastName varchar(100) NOT NULL, 
FirstName varchar(100) NOT NULL, 
FK_Gender varchar(4) NOT NULL, 
DateOfBirth date NOT NULL, 
JobTitle varchar(200) NOT NULL, 
Address1Country varchar(50) NOT NULL, 
Location varchar(200) NOT NULL,
Address1StateOrProvince varchar(50) NOT NULL, 
Department varchar(200) NOT NULL, 
EMailAddress1  varchar(200) NOT NULL
)  

.xml 批量插入格式文件如下所示:

在此处输入图像描述

请注意,如果我跳过 ID(PK + 索引)列,它也可以工作,因为数据库表是空的并且导入文件没有索引。这适用于小型目标表,因为数据库正在生成主键索引。

这里的格式文件为 text():

<?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" MAX_LENGTH="12"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100" COLLATION="Latin1_General_CI_AS"/>
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100" COLLATION="Latin1_General_CI_AS"/>
  <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="4" COLLATION="Latin1_General_CI_AS"/>
  <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="11"/>
  <FIELD ID="6" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="200" COLLATION="Latin1_General_CI_AS"/>
  <FIELD ID="7" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="50" COLLATION="Latin1_General_CI_AS"/>
  <FIELD ID="8" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="200" COLLATION="Latin1_General_CI_AS"/>
  <FIELD ID="9" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="50" COLLATION="Latin1_General_CI_AS"/>
  <FIELD ID="10" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="200" COLLATION="Latin1_General_CI_AS"/>
  <FIELD ID="11" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="200" COLLATION="Latin1_General_CI_AS"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="ID" xsi:type="SQLINT"/>
  <COLUMN SOURCE="2" NAME="LastName" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="3" NAME="FirstName" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="4" NAME="FK_Gender" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="5" NAME="DateOfBirth" xsi:type="SQLDATE"/>
  <COLUMN SOURCE="6" NAME="JobTitle" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="7" NAME="Address1Country" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="8" NAME="Location" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="9" NAME="Address1StateOrProvince" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="10" NAME="Department" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="11" NAME="EMailAddress1" xsi:type="SQLVARYCHAR"/>
 </ROW>
</BCPFORMAT>

它是在命令行中使用 bcp 创建的,如下所示:

在此处输入图像描述

这是文本中的 bcp 命令行:

bcp YFP..tbl_Person_Importtest 格式 nul -f PersonImportMapFile.xml -c -x -T

现在,当我对空的小表执行所有这些文件的导入时,一切都很好:

在此处输入图像描述

如果我再次插入更多行,没问题... 在此处输入图像描述 在此处输入图像描述

大表由于知识产权问题,我无法包含完整的描述,但大目标表有 146 个字段,没有稀疏字段和大量 DATETIME 和 DATE 字段,以及一堆外键(主要是 INT),其中一些是可以为空。这是 bcp 生成的地图文件(字段名称被截断并删除了一些):

   CREATE TABLE [dbo].[tbl_Person](
[ID] [int] IDENTITY(1,1) NOT NULL,
[RecordTitle] [nvarchar](250) NULL,
[SecurityCode] [nvarchar](250) NULL,
[DateCreated] [smalldatetime] NOT NULL,
[FK_User_CreatedBy] [int] NULL,
[wning] [int] NULL,
[ssigned] [int] NULL,
[ollowup] [int] NULL,
[sation_Owning] [int] NULL,
[wning] [int] NULL,
[pdate] [smalldatetime] NULL,
[astUpdate] [int] NULL,
[tatus] [bit] NULL,
[ive] [smalldatetime] NULL,
[eason] [nvarchar](250) NULL,
[tatus] [bit] NULL,
[ion] [smalldatetime] NULL,
[Titles] [int] NULL,
[LastName] [varchar](50) NOT NULL,
[FirstName] [varchar](50) NOT NULL,
[MiddleName] [nvarchar](50) NULL,
[DateOfBirth] [datetime] NULL,
[ion] [ntext] NULL,
[Code] [nvarchar](50) NULL,
[r] [int] NULL,
[] [nvarchar](100) NULL,
[nt] [nvarchar](100) NULL,
[ame] [nvarchar](100) NULL,
[hone] [nvarchar](50) NULL,
[tName] [nvarchar](100) NULL,
[e1] [nvarchar](50) NULL,
[e2] [nvarchar](50) NULL,
[one1] [nvarchar](50) NULL,
[Moe2] [nvarchar](50) NULL,
[Fax] [nvarchar](50) NULL,
[e1] [nvarchar](250) NULL,
[e2] [nvarchar](250) NULL,
[e3] [nvarchar](250) NULL,
[Address1CityOrSuburb] [nvarchar](50) NULL,
[Address1StateOrProvince] [nvarchar](50) NULL,
[Address1Country] [nvarchar](50) NULL,
[Address1PostalCode] [nvarchar](20) NULL,
[Line1] [nvarchar](250) NULL,
[Line2] [nvarchar](250) NULL,
[Line3] [nvarchar](250) NULL,
[CityOrSuburb] [nvarchar](50) NULL,
[StateOrProvince] [nvarchar](50) NULL,
[Country] [nvarchar](50) NULL,
[PostalCode] [nvarchar](20) NULL,
[RL] [nvarchar](200) NULL,
[ress1] [nvarchar](100) NULL,
[ress2] [nvarchar](100) NULL,
[ne] [bit] NULL,
[] [bit] NULL,
[il] [bit] NULL,
[tail] [bit] NULL,
[kEl] [bit] NULL,
[kPalMail] [bit] NULL,
[dMM] [bit] NULL,
[_Preferred] [int] NULL,
[] [int] NULL,
[onStatus] [int] NULL,
[1] [money] NULL,
[2] [money] NULL,
[3] [money] NULL,
[4] [money] NULL,
[5] [money] NULL,
[6] [money] NULL,
[ncome] [money] NULL,
[rInc1] [money] NULL,
[rInc2] [money] NULL,
[rInc3] [money] NULL,
[rInc4] [money] NULL,
[rInc5] [money] NULL,
[rInc6] [money] NULL,
[artner] [money] NULL,
[1] [money] NULL,
[2] [money] NULL,
[3] [money] NULL,
[4] [money] NULL,
[5] [money] NULL,
[6] [money] NULL,
[7] [money] NULL,
[8] [money] NULL,
[ud] [money] NULL,
[] [money] NULL,
[] [money] NULL,
[] [money] NULL,
[] [money] NULL,
[] [money] NULL,
[] [money] NULL,
[lAss] [money] NULL,
[1] [money] NULL,
[2] [money] NULL,
[3] [money] NULL,
[4] [money] NULL,
[5] [money] NULL,
[lDebt] [money] NULL,
[rganisation_Provider] [int] NULL,
[Insurance] [money] NULL,
[ver] [money] NULL,
[itd] [nvarchar](250) NULL,
[veod] [nvarchar](250) NULL,
[fiNominated] [bit] NULL,
[ [money] NULL,
[idD] [nvarchar](50) NULL,
[ccs] [int] NULL,
[mpus] [int] NULL,
[ry] [money] NULL,
[feInsurance] [bit] NULL,
[Cor] [bit] NULL,
[ov] [money] NULL,
[DCer] [bit] NULL,
[mous] [int] NULL,
[iftatus] [int] NULL,
[PCos] [int] NULL,
[PDCus] [int] NULL,
[ersned] [int] NULL,
[ueKey] [uniqueidentifier] NULL,
[rified] [bit] NULL,
[Actr] [smalldatetime] NULL,
[embpe] [int] NULL,
[etAult] [money] NULL,
[t7] [money] NULL,
[t8] [money] NULL,
[6] [money] NULL,
[7] [money] NULL,
[8] [money] NULL,
[onalScore] [nvarchar](10) NULL,
[] [int] NULL,
[rganment] [int] NULL,
[rac] [int] NULL,
[kerpdate] [datetime] NULL,
[keriew] [datetime] NULL,
[ari] [int] NULL,
[] [int] NULL,
[Q1] [int] NULL,
[Q2] [int] NULL,
[Q3] [int] NULL,
[Q4] [int] NULL,
[Q5] [int] NULL,
[Q6] [int] NULL,
[Q7] [int] NULL,
[Q8] [int] NULL,
[Q9] [int] NULL,
[Q10] [int] NULL,
 CONSTRAINT [PK_tbl_Person] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

结果

我应该能够使用与我为上面较小表的示例指定的相同数据文件导入此表,但是我收到了在此问题开头指定的错误。

它选择的字段确实是表中的第五个字段/列,但根据本 MS 教程,它应该只跳到地图中命名的字段。

看起来我需要使用暂存表或其他编程方法与中间件或 SQLBulkCopy (c# .NET),我不想在这个阶段这样做。我只想让地图文件工作。

我错过了什么,还是用地图文件为大桌马拍摄 BULK INSERT 并获得不同的骑行?

4

2 回答 2

2

您可能错过的是教程中使用 XML 格式文件跳过列的示例将数据插入到仅包含目标列的视图中;似乎无法使用 XML 格式文件来跳过目标表中的列。

您可以创建相关列的视图tbl_person并插入其中。

或者,您可以使用旧式的非 XML 格式文件,或者(如果您的环境安全设置允许,可能更容易)使用OPENROWSET(BULK...)- 这两个选项都包含在本教程中。

您可能会考虑更改其他一些事项:

1 - 示例宽表定义与您的输入文件在以下几个方面不匹配:

  • 您的文件中没有该NOT NULL列的源DateCreated- 您可能需要一个DEFAULT约束来设置该值 - 也许这存在但在示例表定义中被省略了?
  • 该表不包含FK_GenderJobTitleLocationDepartmentEMailAddress1列,即使它们是引用的格式文件 - 这可能是您编辑列名的副作用。

2 - 您可以使用如下命令生成与数据文件更匹配的格式文件,该命令将字段终止符正确设置为逗号:

bcp YFP..tbl_Person_Importtest format nul -f c:\temp\so.bcp.gen.test.fmt -c -x -T -t ,

3 - 您的BULK INSERT命令的屏幕截图包括以下命令:

SET IDENTITY INSERT <table> OFF

在批量插入之前。这有两个问题:

  • 这不会BULK INSERT在您使用该KEEPIDENTITY选项的命令上下文中执行任何操作。

  • 设置IDENTITY INSERT OFF禁用标识值的插入(即正常行为)。如果使用该OPENROWSET(BULK...)方法,则需要IDENTITY INSERT ON在命令运行之前设置以启用身份插入,然后IDENTITY INSERT OFF在命令完成后设置。

于 2017-03-27T08:40:11.780 回答
1

对于您的情况,列数不是 bcp 问题。

最可能的原因是数据类型不匹配或 FK 问题。

用于调试。

删除表上的约束

或者

创建表的副本( select * into temptable from table where 1=2)

使用-e选项对 temptable 执行 BCP ,如果错误文件中有记录,则为数据类型/格式问题。

如果将数据复制到 temptable 中,则检查所有约束,例如 fk ,ak....

于 2017-03-24T06:26:38.037 回答