Утилита BCP для экспорта\импорта в MSSQL

Создано Евгений Злобин в января 26, 2011

Есть одна отличная утилита от Майкрософт, которая идёт в поставке вместе с SQL Server.
И насколько я покопался в интернете утилита особой популярности не взыскала (особенно это заметно на хабре, учитывая почти полное отсутствие статей на эту тематику). А зря!

BCP предназначена для быстрого, можно сказать оочень быстрого экспорта-импорта данных для MSSQL. Запускается эта утилита из командной строки, видимо тот факт, что её особо нигде не афишировали (в частности в меню для SQL сервера) и послужило тому, что её мало используют.

Описывать как её применять я не буду, для этого есть MSDN. В данном посте я опишу пример конкретной задачи, которую пришлось решить при помощи BCP.

Задача: написать скрипт при помощи которого можно будет делать регулярный экспорт данных из таблицы в файл, CSV формата.

Пояснение: у нас имеется таблица пользователей для определенного сайта. И раз в неделю необходимо экспортировать данные о юзерах в файл формата, похожим на CSV. При этом нужно учитывать, что данные не должны содержать определенных символов, т.е. левые символы (список имеется) нужно удалять.

Для примера я приведу самые простой набор полей в таблице. Чтобы не усложнять все это дело.

Возьмём абстрактную таблицу с пользователями:

[Users]
– id
– FirstName
– LastName
– DateOfBirth
– sex
– confirm

и таблицу, где у нас хранится последний отгруженный ID юзера, дата отгрузки и кол-во пользователей.

[Counters]
— id
— lid
— counters
— DateOut

Для начала напишем функцию для MSSQL которая будет удалять все ненужные символы (<,>,|):


CREATE FUNCTION [dbo].my_replace(@str nvarchar(4000))
RETURNS nvarchar(4000)
AS
BEGIN
    DECLARE @mydata nvarchar(4000);
    SET @mydata = REPLACE(REPLACE(REPLACE(@str,'<',''),'>',''),'|','');
    RETURN(@mydata);
END;
Теперь нужно выполнить эту функцию и обязательно в области видимости BCP.
Приступим к SQL коду, который будет вытаскивать все данные из базы. Т.к. может случиться так, что подзапросы будут запрещены, то запихнём результаты в переменные.
DECLARE @id integer;
DECLARE @lid integer;
DECLARE @counter integer;
SET @id = (SELECT TOP 1 lid
                FROM [dbo].[Counters]
                ORDER BY id DESC);
SET @lid = (SELECT TOP 1 id
                 FROM [dbo].[Users]
                 ORDER BY id DESC);
SET @counter = (SELECT COUNT([Users].[id])
                        FROM [dbo].[Users]
                        WHERE [dbo].[Users].[id]>@id);
Теперь формируем сам заголовок полей для файла, заметьте, что у нас появилось ещё одно поле, которого нет в таблице, но которое нужно для отгрузки данных. Помимо написанной нами ранее функции удаления лишних данных, нужно переконвертировать все данные в строковый формат, т.к. используется UNION и тип, и количество полей должны совпадать. Форматы преобразования для даты можно найти по этой ссылке http://msdn.microsoft.com/ru-ru/library/ms187928.aspx.

SELECT  'id' as c1, 'FirstName' as c2, 'LastName' as c3,
 'DateOfBirth' as c4, 'sex' as c5, 'confirm' as c6, 'country'  as c7
UNION all
          SELECT Convert(nvarchar, [id]),
              [dbo].my_replace([FirstName]) as FirstName,
              [dbo].my_replace([LastName]) as LastName,
              Convert(nvarchar, [Dateofbirth], 120),
              Convert(nvarchar, [sex]),
              Convert(nvarchar, [confirm]),
              'ru'
          FROM [dbo].[Users]
          WHERE Id > @id; 
И после получения данных добавляем в нашу таблицу «счетчик» необходимые данные.
INSERT INTO
    [dbo].[import_counter]
         ([lid], [counters], [DateOut])
    VALUES
         (@lid, @counter, GETDATE());
Приступим к самой BCP.
bcp «<SQL_CODE>» queryout d:\file.txt -c -t «||» -r «\n» -C 65001 -T -S <SERVER_ADDRESS> -U <USER_NAME> -P <USER_PASS>

queryout d:\file.txt – означает, что результат запроса будет помещен в файл
-c выполняет операцию, используя символьный тип данных.
-t «||» назначает разделитель между полями
-r «\n» назначает символ конца строки
-C 65001 указывает используемую кодировку (UTF8 в данном случае)
-T указывает, что программа bcp выполняет подключение к SQL Server по доверенному соединению с помощью встроенной безопасности. (если не удастся соединиться по доверенному соединению будут использованы логин и пароль указанные дальше)

Вместо <SQL_CODE> вставляем весь наш получившийся SQL код, кроме функции. Её нужно выполнить заранее. <SERVER_ADDRESS>  - адрес SQL сервера
<USER_NAME>              - имя пользователя для подключения к SQL
<USER_PASS>                - пароль пользователя
Вот собственно и всё. Вполне может быть кому-то пригодится. Да и пусть будет здесь сохранено, чтобы самому не забыть.

Может быть Вам это интересно?

31 отв. в “Утилита BCP для экспорта\импорта в MSSQL”

  1. да, вроде неплохая утилита, нужно будет поискать еще информации

  2. Очень платформозависимо.

  3. Александр

    Впервые слышу о такой утилите, надо будет погуглить на сей счет

  4. Утилит очень хорош но только для работы в полном комплекте лицензионного ПО. И еще данные не отгружаются сразу на сервер, а сразу на машину вашу, а там в течении суток вы проверяете что можно что нельзя. Если не успели то все пошло) Как на Жабе.

  5. Маргарита

    Непознанная утилита, но заинтересовала!

  6. Интересная информация обдумаю на досуге как бы лучше по эксплотировать данную утилиту

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

  8. Утилита вроде не плохая,никогда не слышал, можно еще немного информации выложить? а то пару моментов остались не понятными. Спасибо

  9. Помоему есть более удобные утилиты. Работал с этой, но не совсем понравилось

  10. Кто-нибудь умеет с помощью bcp.exe при выгрузке данных делать первую строку с названием столбцов?

  11. Евгений Злобин

    Dom Interior, названия столбцов я здесь показываю как выгружать. Правда я указываю их названия вручную и объединяю запрос через UNION. А по поводу первой строки. В BCP насколько помню есть похожий параметр, да и к тому же TOP 1 в самом SQL запросе не поможет?

  12. Я чего-то не нашел где ее можно скачать. Поделитесь ссылочкой!

  13. Мальчишка с любовью

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

  14. Думаю она сэкономит время, но есть также еще куча более полезные утилиты

  15. Сергей

    Автор блога затронул очень интересную тему. Респект и уважение ему за работу.
    Читаю с удовольствием. Спасибо.

  16. Такая прога не всегда нужна, но в запаснике держать надо.

  17. Ценный продукт под рукой разработан самими мелкомягкими, но как обычно, мало рекламы и о ней почти никто не знает. Спасибо за окрытие глаз на быстрое решение задач.

  18. Хоть и платформозависимо, другой утилиты от майкрософта для того, чтобы сделать автоматизированный импорт данных в CSV через скрипт нет

  19. можно подумать над использованием, П.С. это сайт всё время вылезающий просто бесит.

  20. Автору спасибо. Воспользуюсь обязательно.

  21. Очень познавательная статья!
    утилита нужная, надо взять на заметку.

  22. Возможно, мелкомягкие написали эту тулзу или для специально для какого-то корпоративного заказчика.

  23. Мне тоже эта утилита покатила очень неплохо. спасибо.

  24. А я использую табы от Димокса

  25. Впервые слышу о данной утилите, но обязательно ее попробую и позже отпишусь.

  26. хорошо написано, правда местами трудно разобраться, но думая это поправимо

  27. Есть одна отличная утилита от Майкрософт, которая идёт в поставке как нельзя очень вместе с SQL Server. И как нельзя именно насколько я покопался в интернете утилита особой популярности не взыскала

  28. Класная утилита! Я ей пользовался однажды и остался весьма доволен :) .

  29. подскажите пожалуйста где еще можно почитать про эту утилиту,а то не могу найти,заранее благодарен

  30. Точ то я давно искал как раз с переездом на новый хост пригодится спасибо!

  31. Объясните еще раз пожалуйста как с помощью bcp.exe при выгрузке данных делать самую первую строчку с названиями столбцов?

Оставить ответ