一段时间以来,我一直对此表示怀疑,所以我终于在征求一些建议。我们有一个非常不幸的表,它设计得很糟糕,性能不好,而且已经存在了很长时间,已经有很多客户在其中每个表中放置了大约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).
谢谢
答案 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