Импортировать выходные данные bcp, исключая дату и время - PullRequest
0 голосов
/ 12 октября 2018

Я некоторое время бился с этим, поэтому я наконец-то попросил несколько предложений.У нас есть, к сожалению, очень хорошо спроектированная таблица, которая работает недостаточно хорошо, и она существует достаточно долго, и многие клиенты вложили в нее около 50 миллионов строк.

Я экспериментировал со способамиисправление структуры таблицы, но, очевидно, самое большое ограничение - эффективная миграция данных.Удаление первичных ключей и перестановка таблицы приводит к удалению дискового пространства в журнале транзакций.Создание новой таблицы и выполнение INSERT new SELECT * OLD аналогично.

Я начал экспериментировать с bcp и пытался следовать рекомендациям, которые я нашел здесь (это было связано со статьей Oflow - http://www.sommarskog.se/bulkload.html), но до сих пор я застрял из-за проблемы с импортом. В первой строке всегда происходит сбой при попытке обработать столбец datetime . Ничто из того, что я обнаружил в любой статье Oflow, похоже не помогаетрешить проблему.

Я выполнил экспорт bcp с -N, чтобы получить весь основной режим, создал файл форматирования с -N. Новая таблица, в которую я пытался импортировать, отличалась только в первичных ключах и индексах,не макет столбца, это не сработало. Я попытался создать пустую таблицу с той же структурой, но это не сработало. Я попробовал все 3 метода импорта, описанных в статье выше, но ни один из них не преодолел проблему импорта с датой и временем.

Я надеюсь, что кто-нибудь может подсказать мне, как обойти проблему импорта из даты и времени.

Схема таблицы:

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 голосов
/ 12 октября 2018

Похоже, что это тихий, но смертельный конфликт вариантов экспорта.Когда я вернулся к просмотру ссылки в ответе Вергилия, я заметил, что я случайно оставил -c в строке экспорта при переключении в основной режим.Bcp не жаловался, но созданный выходной файл не является действительным.

bcp NotesTest.Notes out .\Notes2.bcp -c -N -U foo -P bar -S dbserver
0 голосов
/ 12 октября 2018

Пожалуйста, ознакомьтесь с этим описанием параметров импорта собственного формата.

Тип файла данных для импорта собственного BCP должен быть 'Native', и файл формата не должен использоваться. Если таблицы идентичны,Вот два конкретных параметра командной строки:

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.

Попробуйте импортировать стандартные файлы по умолчанию и посмотрите, работают ли они для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...