导入bcp输出,在日期时间进行倒推

时间:2018-10-12 15:47:43

标签: sql-server tsql

一段时间以来,我一直对此表示怀疑,所以我终于在征求一些建议。我们有一个非常不幸的表,它设计得很糟糕,性能不好,而且已经存在了很长时间,已经有很多客户在其中每个表中放置了大约5000万行。

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

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

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

谢谢

2 个答案:

答案 0 :(得分:0)

请签出this description of native format import options.

本机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.

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

答案 1 :(得分:0)

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

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