我一直对此感到头疼,所以我终于在征求一些建议。 我们有一个非常不幸的表,它设计得不好,而且已经存在了足够长的时间,以至于有许多客户向其中分别放入了5000万行。

我一直在尝试修改表设计的方法,但是显然,最大的限制是如何有效地迁移数据。 删除主键并重新组织表会浪费事务日志上的磁盘空间。 同样,创建一个新表并执行INSERT new SELECT * OLD。

我开始尝试bcp ,并尝试遵循在这里找到的建议(这是从Oflow文章链接到的-http: //www.sommarskog.se/bulkload.html ),但到目前为止,我在导入方面遇到了问题。 它总是在第一行失败,尝试处理datetime列。 我在任何Oflow文章中都没有找到解决该问题的方法。

我使用-N进行bcp导出以获取所有纯模式,并使用-N创建了格式文件。 我尝试导入的新表在主键和索引上有所不同,而不是列布局; 那没有用。 我尝试创建一个具有相同结构的空表; 那没有用。 我尝试了以上文章中介绍的所有3种导入方法; 他们都没有超过datetime导入问题。

我希望有人可以指导我如何解决datetime导入问题。

表架构:

CREATE TABLE [Notes](
[NoteID] [int] IDENTITY(1,1) NOT NULL,
[ObjectTypeID] [tinyint] NOT NULL,
[ObjectID] [int] NOT NULL DEFAULT ((0)),
[CreationTime] [datetime] NOT NULL,
[NoteTypeID] [tinyint] NOT NULL,
[AuthorUserID] [int] NOT NULL,
[AuthorName] [nvarchar](200) NULL,
[AuthorEmail] [nvarchar](100) NULL,
[Message] [nvarchar](max) NOT NULL,
[ObjectSubTypeID] [tinyint] NOT NULL,
[IpAddr] [nvarchar](48) NULL,
[Source] [tinyint] NULL,
CONSTRAINT [PK_RC_Note] PRIMARY KEY CLUSTERED 
(
[ObjectTypeID] ASC,
[ObjectID] ASC,
[CreationTime] DESC,
[NoteID] 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]

导出方法:

bcp NotesTest.Notes out .\Notes2.bcp -c -N -U foo -P bar -S dbserver
bcp NotesTest.Notes format nul -T  -f Notes.fmt -N -U foo -P bar -S dbserver

导入方法尝试:

bcp NotesTest.Notes in .\Notes2.bcp -U foo -P bar -S dbserver -h TABLOCK -b 50000 -f Notes.fmt

BULK INSERT Notes
FROM '\\myserver\myshare\notes2.bcp'
WITH (
     BATCHSIZE      = 50000
    ,CODEPAGE       = 'RAW'
    ,DATAFILETYPE   = 'native'
    ,FIRSTROW       = 1
    ,FORMATFILE     = '\\myserver\myshare\Notes.fmt'
    ,MAXERRORS      = 20
    ,TABLOCK
    );

SET IDENTITY_INSERT RC.RC_Note ON
INSERT INTO RC.RC_Note (NoteID, ObjectTypeID, ObjectID, CreationTime, NOteTypeID,AuthorUserID,AUthorName, AuthorEmail,Message,ObjectSubTypeID,IpAddr,Source) 
    SELECT NoteID, ObjectTypeID, ObjectID, CreationTime, NOteTypeID,AuthorUserID,AUthorName, AuthorEmail,Message,ObjectSubTypeID,IpAddr,Source
    FROM OPENROWSET(BULK '\\myserver\myshare\notes2.bcp',
    FORMATFILE='\\myserver\myshare\Notes.fmt'
) AS t1;

在所有导入上均收到错误消息(根据方法的不同,其外观也会有所不同):

Bulk load data conversion error (truncation) for row 1, column 4 (CreationTime).

谢谢

#1楼 票数:0

请查看本机格式导入选项的描述。

如果表相同,则本机BCP导入的数据文件类型应为“本机”,并且不应使用任何格式文件。 这是两个特定的命令行选项:

Command      Option                  Description
bcp            -n                    Causes the bcp utility to use the native data types of the data.
BULK INSERT  DATAFILETYPE ='native'  Uses the native or wide native data types of the data. Note that DATAFILETYPE is not needed if a format file specifies the data types.

尝试默认的本机文件导入,然后查看它们是否对您有用。

#2楼 票数:0 已采纳

因此,这似乎是出口选择的沉默但致命的冲突。 当我回头查看Vergil的答案中的链接时,我注意到当我切换到纯模式时,我不小心将-c留在了导出行中。 Bcp没有抱怨,但是它产生的输出文件似乎无效。

bcp NotesTest.Notes out .\Notes2.bcp -c -N -U foo -P bar -S dbserver

  ask by user1664043 translate from so

未解决问题?本站智能推荐:

2回复

bcp输出问题

以下代码存在一些问题。 此代码的主要原因是将SQL语句导出到文件中。 但这是行不通的,我看不到我的错误。 错误消息是: 你看到我的错了吗?
1回复

BCP在输出中增加空间

该BCP语句在我的数据之间添加了一个空格。 看图片 这是DDL和样本数据-我需要更改什么以便不增加空间? (空列)
1回复

NULL显示为在SQL中执行bcp命令的输出

我正在建立要在SQL中使用bcp实用程序执行的query 。 执行查询后,我得到一个NULL结果作为输出。 我已经在相关讨论中提出了一个问题,但是这个问题集中在不同类型的错误上。 这是我的查询: 这是我为了确保查询正确而显示的最终查询语法: SELECT 'Transactio
1回复

使用BCP时如何在@SqlStr中进行多次选择

我有这样的代码运行没有错误,我得到了结果。 但是当我想在sqlstr中进行多次选择时,就像这样 我收到了这个错误 'EmployeeJob'附近的语法不正确 如何进行上面的多重选择?
6回复

如何将日期时间与SQLServer中的日期进行比较

但是在数据库中,用户是在2014-02-07 12:30:47.220 ,当时我只把'2014-02-07' 它不显示任何数据
1回复

为SQL2012使用重音字符的BCP导入

我以这种格式为 bcp 创建了一个 .csv 文件: 我有 bcp in 命令工作如下: 使用以下格式命令和文件: 这有效并上传,但不能正确上传重音字符。 我已经查看了SQL 文档,但示例并没有解决这个问题。 我的 .csv 是这种数据格式: 我是不是误解了,我应该更正格式文件、上传 IN 命令,还
3回复

将“日期”列与日期时间值进行比较

我在我们的stored procedures之一中找到以下查询 由于where子句中的Functions用法可能会影响性能,因此我将其更改如下, 更改代码后的结果相同。 但是我不确定两者是否始终会给出相同的结果。 以上代码带来不同结果的任何场景? (PS:@wkstdate和@
18回复

将日期字符串与SQLServer中的日期时间进行比较?

在SQL Server中,我有一个包含时间元素的DATETIME列。 例: 仅选择特定日期的记录,忽略时间部分的最佳方法是什么? 示例:(不安全,因为它与时间部分不匹配并且不返回任何行) 注意:鉴于这个网站也是关于记下你选择的笔记和技术,然后忘记,我将发布我自己的答案,因为MSS