SQL Server BCP вставить дополнительные столбцы - PullRequest
1 голос
/ 17 декабря 2008

Мой рейтинг:

Входной файл:

1, азбука, хухи

2, Защита, MnO

3, ГХИ, сув

Структура таблицы БД:

Col1 char

col2 char

col3 char

col4 char

col5 char

Данные в таблице после ППГ:

col1 col2 col3 col4 col5

1 abc xyz ab xy

2 def mno de mn

3 гхи сув гх су

В основном, col4 и col5 являются рассчитанными значениями из значений col2 и col3.

Поддерживает ли утилита SQL Server BCP такие операции? Любые указатели будут оценены.

Приветствие GT

Ответы [ 5 ]

3 голосов
/ 29 мая 2009

Вы можете использовать файл формата, чтобы указать, какое поле данных сопоставляется с каким столбцом

Вы можете использовать формат файла при импорте с помощью bcp:

Создайте файл формата для вашей таблицы:

 bcp [table_name] format nul -f [format_file_name.fmt] -c -T 

Это создаст файл, подобный этому:

 9.0
5
1       SQLCHAR       0       100     ","      1     Col1             SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR       0       100     ","      2     Col2             SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     ","      3     Col3           SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       100     ","      3     Col4           SQL_Latin1_General_CP1_CI_AS
5       SQLCHAR       0       100     ","      3     Col5           SQL_Latin1_General_CP1_CI_AS

Редактировать файл импорта. Хитрость в том, чтобы УДАЛИТЬ столбцы, которые вам не нужны (поля 4 и 5 в этом примере) И также обновить количество столбцов: это вторая строка в файле формата. В этом примере измените 5 на 3. Затем импортируйте данные, используя этот файл формата, указав ваш входной файл, этот файл формата и разделитель:

bcp [table_name] in [data_file_name] -t , -f [format_file_name.fmt] -T 
2 голосов
/ 17 декабря 2008

Вы можете BCP в промежуточный стол, а затем вставить из промежуточного стола в соответствующей структуре в другой стол.

Вы также можете использовать BULK INSERT из SQL с тем же форматным файлом и исходным файлом, что и из внешней команды BCP, чтобы можно было запустить весь пакет в SQL: BULK INSERT для сопоставления входных данных, а затем INSERT INTO Финальный стол.

Другой вариант предварительной обработки, такой как Perl (или любой другой инструмент командной строки), - это PowerShell для передачи данных по битам перед использованием BCP (возможно, с опцией XML): http://www.sqlservercentral.com/articles/powershell/65196/

Мой предпочтительный вариант, вероятно, будет SSIS, который имеет весь арсенал доступных вам преобразований, включая производные столбцы.

1 голос
/ 17 декабря 2008

Нет, вы не можете сделать это с BCP, хотя вы можете использовать BCP, чтобы извлечь набор данных из запроса и создать дамп в файл.

Если вы хотите сделать это без использования запроса из источника, вам придется выполнить bcp в файл, постобработать файл скриптом perl или чем-то подобным, чтобы получить вычисляемые столбцы, а затем повторно импортировать файл. к месту назначения с контрольным файлом BCP соответствующего формата.

РЕДАКТИРОВАТЬ: BCP довольно упрощен. Если вы не можете использовать клиентские инструменты, вы можете вставить их в промежуточную таблицу и затем вычислить производные значения в хранимой процедуре.

0 голосов
/ 03 июля 2014

Если вы не боитесь немного программировать, вы можете сделать это с помощью ADO.NET. Это, как и любые другие преобразования, которые вы хотите сделать на лету, может быть сделано довольно легко путем реализации пользовательского IDataReader. SqlBulkCopy принимает IDataReader и массово вставляет данные, которые он предоставляет. Ваш читатель может затем использовать входной файл и предоставлять дополнительные столбцы, преобразовывать данные, искать значения ключей и так далее.

0 голосов
/ 17 декабря 2008

SQL Server Integration Services и преобразования будут моим выбором. Это довольно простой пакет для создания необходимых преобразований, а SSIS чертовски быстр, прост в планировании и т. Д.

...