Утилита 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;
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);
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.exe при выгрузке данных делать первую строку с названием столбцов?
Dom Interior, названия столбцов я здесь показываю как выгружать. Правда я указываю их названия вручную и объединяю запрос через UNION. А по поводу первой строки. В BCP насколько помню есть похожий параметр, да и к тому же TOP 1 в самом SQL запросе не поможет?
Я чего-то не нашел где ее можно скачать. Поделитесь ссылочкой!
Я думаю что лучшей утилиты не будет, мне она очень нравиться.
Думаю она сэкономит время, но есть также еще куча более полезные утилиты
Автор блога затронул очень интересную тему. Респект и уважение ему за работу.
Читаю с удовольствием. Спасибо.
Такая прога не всегда нужна, но в запаснике держать надо.
Ценный продукт под рукой разработан самими мелкомягкими, но как обычно, мало рекламы и о ней почти никто не знает. Спасибо за окрытие глаз на быстрое решение задач.
Хоть и платформозависимо, другой утилиты от майкрософта для того, чтобы сделать автоматизированный импорт данных в CSV через скрипт нет
можно подумать над использованием, П.С. это сайт всё время вылезающий просто бесит.
Автору спасибо. Воспользуюсь обязательно.
Очень познавательная статья!
утилита нужная, надо взять на заметку.
Возможно, мелкомягкие написали эту тулзу или для специально для какого-то корпоративного заказчика.
Мне тоже эта утилита покатила очень неплохо. спасибо.
А я использую табы от Димокса
Впервые слышу о данной утилите, но обязательно ее попробую и позже отпишусь.
хорошо написано, правда местами трудно разобраться, но думая это поправимо
Есть одна отличная утилита от Майкрософт, которая идёт в поставке как нельзя очень вместе с SQL Server. И как нельзя именно насколько я покопался в интернете утилита особой популярности не взыскала
Класная утилита! Я ей пользовался однажды и остался весьма доволен
.
подскажите пожалуйста где еще можно почитать про эту утилиту,а то не могу найти,заранее благодарен
Точ то я давно искал как раз с переездом на новый хост пригодится спасибо!
Объясните еще раз пожалуйста как с помощью bcp.exe при выгрузке данных делать самую первую строчку с названиями столбцов?