Как использовать служебную программу bcp

Применимо к:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)База данных SQL в Microsoft Fabric

Программа массового копирования (bcp) копирует данные между экземпляром SQL Server и файлом данных в указанном пользователем формате.

Замечания

Поддержка собственного файла данных

В SQL Server программа bcp поддерживает собственные файлы данных, совместимые с версиями SQL Server, начиная с SQL Server 2000 (8.x) и более поздних версий.

Вычисляемые столбцы и столбцы с временной меткой

Значения в импортируемом файле данных для вычисляемых или timestamp столбцов игнорируются, а SQL Server автоматически назначает значения. Если файл данных не содержит значения для вычисляемых или меток времени в таблице, используйте файл форматирования, чтобы указать, что вычисляемые или метки времени в таблице должны пропускаться при импорте данных; SQL Server автоматически назначает значения столбца.

Вычисляемые и временные метки пакетно копируются из SQL Server в файл данных как обычно.

Укажите идентификаторы, содержащие пробелы или кавычки

Идентификаторы SQL Server могут включать такие символы, как внедренные пробелы и кавычки. Такие идентификаторы должны обрабатываться следующим образом.

  • Если идентификатор или имя файла содержит пробел или кавычку в командной строке, заключите идентификатор в двойные кавычки ("").

    Например, следующая команда bcp out создает файл данных с именем Currency Types.dat:

    bcp AdventureWorks2022.Sales.Currency out "Currency Types.dat" -T -c
    
  • Чтобы указать имя базы данных, содержащее пробел или кавычки, необходимо использовать параметр -q.

  • Для имён владельца, таблицы или представления, содержащих пробелы или кавычки, вы можете либо:

    • указать параметр -q; или

    • Заключите имя владельца, таблицы или представления в квадратные скобки ([]) и поместите их внутри кавычек.

Проверка данных

Bcp теперь применяет валидацию и проверку данных, которые могут привести к сбою выполнения сценариев, если они выполняются на недопустимых данных в файле с данными. Например, программа bcp проверяет, что:

  • собственные представления типов данных float или real являются допустимыми.

  • Данные в Юникоде имеют четную длину.

Формы недопустимых данных, которые могут быть массово импортированы в более ранних версиях SQL Server, могут не загружаться сейчас; В то время как в более ранних версиях сбой не возникал до тех пор, пока клиент не пытался получить доступ к недопустимым данным. Добавленная проверка снижает вероятность непредвиденных ситуаций во время запроса данных после массовой загрузки.

Массовый экспорт или импорт документов SQLXML

Чтобы выполнить массовый экспорт или импорт SQLXML-данных используйте один из следующих типов данных в файле форматирования:

Тип данных Эффект
SQLCHAR или SQLVARYCHAR Данные отправляются на клиентской кодовой странице или на кодовой странице, подразумеваемой параметрами сортировки. Результат тот же, что и при указании параметра -c без указания файла форматирования.
SQLNCHAR или SQLNVARCHAR Данные отправляются в Юникоде. Результат тот же, что и при указании параметра -w без указания файла форматирования.
SQLBINARY или SQLVARYBIN Данные отправляются без преобразования.

Рекомендации по режиму символов (-c) и естественному режиму (-n)

В этом разделе содержатся рекомендации по режиму символов (-c) и собственному режиму (-n).

  • (Администратор или пользователь) По возможности используйте собственный формат (-n), чтобы избежать проблемы с разделителем. Используйте собственный формат для экспорта и импорта с помощью SQL Server. Экспортируйте данные из SQL Server с помощью -c или -w параметра, если планируется экспортировать данные в базу данных, отличной от SQL Server.

  • (Администратор) Проверьте данные при использовании bcp out. Например, при использовании bcp out, bcp in, а затем bcp out, удостоверьтесь, что данные экспортируются правильно, а значения терминаторов не используются как часть значений данных. Рекомендуется переопределить стандартные заменяющие символы (используя параметры -t и -r) случайными шестнадцатеричными значениями, чтобы избежать конфликтов между значениями терминаторов и значениями данных.

  • (Пользователь) Используйте длинные и уникальные концевые символы (любая последовательность байт или символов), чтобы свести к минимуму возможность конфликта с реальным значением строки. Это можно сделать с помощью -t и -r параметров.

Примеры

Примеры, приведенные в этом разделе, используют тестовую базу данных WideWorldImporters для SQL Server 2016 (13.x) и более поздних версий, Azure SQL Database и Azure SQL Managed Instance. WideWorldImporters можно скачать отсюда: https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0. См. инструкции RESTORE для получения синтаксиса восстановления образца базы данных.

Пример условий теста

За исключением случаев, указанных иначе, в примерах предполагается, что вы используете проверку подлинности Windows и имеете надежное подключение к экземпляру сервера, на котором выполняется команда bcp. Имя каталога D:\bcp используется во многих примерах. Замените <server_name> и другие значения заполнителей значениями для вашей среды.

Следующий скрипт Transact-SQL создает пустую копию таблицы WideWorldImporters.Warehouse.StockItemTransactions, а затем добавляет ограничение первичного ключа:

USE WideWorldImporters;
GO

SET NOCOUNT ON;

IF NOT EXISTS (SELECT *
               FROM sys.tables
               WHERE name = 'Warehouse.StockItemTransactions_bcp')
    BEGIN
        SELECT *
        INTO WideWorldImporters.Warehouse.StockItemTransactions_bcp
        FROM WideWorldImporters.Warehouse.StockItemTransactions
        WHERE 1 = 2;

        ALTER TABLE Warehouse.StockItemTransactions_bcp
        ADD CONSTRAINT PK_Warehouse_StockItemTransactions_bcp
            PRIMARY KEY NONCLUSTERED (StockItemTransactionID ASC);
    END

Вы можете усечь таблицу StockItemTransactions_bcp по мере необходимости:

TRUNCATE TABLE WideWorldImporters.Warehouse.StockItemTransactions_bcp;

А. Определение версии служебной программы bcp

В командной строке введите следующую команду:

bcp -v

B. Копирование строк таблицы в файл данных (с доверенным подключением)

В следующих примерах показана опция out на таблице WideWorldImporters.Warehouse.StockItemTransactions.

  • Basic

    В этом примере создается файл данных с именем StockItemTransactions_character.bcp , и в него копируются данные таблицы в символьном формате.

    В командной строке введите следующую команду:

    bcp WideWorldImporters.Warehouse.StockItemTransactions out D:\bcp\StockItemTransactions_character.bcp -c -T
    
  • Expanded

    В этом примере создается файл данных с именем StockItemTransactions_native.bcp , и в него копируются данные таблицы в собственном формате. Пример также указывает максимальное количество синтаксических ошибок, файл ошибок и выходной файл.

    В командной строке введите следующую команду:

    bcp WideWorldImporters.Warehouse.StockItemTransactions OUT D:\bcp\StockItemTransactions_native.bcp -m 1 -n -e D:\bcp\Error_out.log -o D:\bcp\Output_out.log -S <server_name> -T
    

Просмотрите Error_out.log и Output_out.log. Error_out.log должно быть пустым. Сравните размеры файлов между StockItemTransactions_character.bcp и StockItemTransactions_native.bcp.

C. Копирование строк таблицы в файл данных (с проверкой подлинности в смешанном режиме)

В следующем примере показан out параметр в WideWorldImporters.Warehouse.StockItemTransactions таблице. В этом примере создается файл данных с именем StockItemTransactions_character.bcp , и в него копируются данные таблицы в символьном формате.

В примере предполагается, что вы используете проверку подлинности в смешанном режиме, и необходимо использовать -U параметр для указания идентификатора входа. Кроме того, если вы не подключаетесь к экземпляру SQL Server по умолчанию на локальном компьютере, используйте -S параметр, чтобы указать имя системы и, при необходимости, имя экземпляра.

В командной строке введите следующую команду. Система запросит ваш пароль.

bcp WideWorldImporters.Warehouse.StockItemTransactions out D:\bcp\StockItemTransactions_character.bcp -c -U<login_id> -S<server_name\instance_name>

D. Копирование данных из файла в таблицу

В следующих примерах иллюстрируется параметр in на таблице WideWorldImporters.Warehouse.StockItemTransactions_bcp, используя файлы, созданные ранее.

  • Basic

    В этом примере используется ранее созданный файл данных StockItemTransactions_character.bcp .

    В командной строке введите следующую команду:

    bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp IN D:\bcp\StockItemTransactions_character.bcp -c -T
    
  • Expanded

    В этом примере используется ранее созданный файл данных StockItemTransactions_native.bcp . В примере также используется TABLOCK указание, и указывается размер пакета, максимальное количество синтаксических ошибок, файл с ошибками и выходной файл.

    В командной строке введите следующую команду:

    bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp IN D:\bcp\StockItemTransactions_native.bcp -b 5000 -h "TABLOCK" -m 1 -n -e D:\bcp\Error_in.log -o D:\bcp\Output_in.log -S <server_name> -T
    

    Просмотрите Error_in.log и Output_in.log.

E. Копирование определенного столбца в файл данных

Чтобы скопировать определенный столбец, можно использовать опцию queryout. Следующий пример копирует в файл данных из таблицы StockItemTransactionID только столбец Warehouse.StockItemTransactions .

В командной строке введите следующую команду:

bcp "SELECT StockItemTransactionID FROM WideWorldImporters.Warehouse.StockItemTransactions WITH (NOLOCK)" queryout D:\bcp\StockItemTransactionID_c.bcp -c -T

F. Копирование определенной строки в файл данных

Чтобы скопировать определенную queryout строку, можно использовать этот параметр. Следующий пример копирует только строку человека с именем Amy Trefl из таблицы WideWorldImporters.Application.People в файл данных Amy_Trefl_c.bcp.

Note

Переключатель -d используется для идентификации базы данных.

В командной строке введите следующую команду:

bcp "SELECT * from Application.People WHERE FullName = 'Amy Trefl'" queryout D:\bcp\Amy_Trefl_c.bcp -d WideWorldImporters -c -T

G. Копирование данных из запроса в файл данных

Чтобы скопировать результирующий набор из инструкции Transact-SQL в файл данных, используйте этот queryout параметр. Следующий пример копирует имена из таблицы WideWorldImporters.Application.People , упорядоченные по полному имени, в файл данных People.txt .

Note

Параметр -t используется для создания файла, разделённого запятыми.

В командной строке введите следующую команду:

bcp "SELECT FullName, PreferredName FROM WideWorldImporters.Application.People ORDER BY FullName" queryout D:\bcp\People.txt -t, -c -T

H. Создание файлов форматирования

Следующий пример создает три разных файла форматирования для таблицы Warehouse.StockItemTransactions в базе данных WideWorldImporters . Просмотрите содержимое каждого из созданных файлов.

В командной строке введите следующие команды:

REM non-XML character format
bcp WideWorldImporters.Warehouse.StockItemTransactions format nul -f D:\bcp\StockItemTransactions_c.fmt -c -T

REM non-XML native format
bcp WideWorldImporters.Warehouse.StockItemTransactions format nul -f D:\bcp\StockItemTransactions_n.fmt -n -T

REM XML character format
bcp WideWorldImporters.Warehouse.StockItemTransactions format nul -f D:\bcp\StockItemTransactions_c.xml -x -c -T

Note

Переключатель -x поддерживается только на Windows.

Дополнительные сведения см. в разделах Файлы форматов, отличных от XML (SQL Server) и Файлы XML-форматов (SQL Server).

I. Использование файла форматирования для массового импорта с помощью bcp

Чтобы использовать ранее созданный файл форматирования при импорте данных в экземпляр SQL Server, используйте переключатель -f с параметром in. Например, следующая команда выполняет массовое копирование содержимого файла данных StockItemTransactions_character.bcpв копию таблицы Warehouse.StockItemTransactions_bcp с помощью ранее созданного файла форматирования StockItemTransactions_c.xml.

Note

Параметр -L используется для импорта только первых 100 записей.

В командной строке введите следующую команду:

bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp in D:\bcp\StockItemTransactions_character.bcp -L 100 -f D:\bcp\StockItemTransactions_c.xml -T

Note

Файлы форматирования используются в тех случаях, когда поля файла данных отличаются от столбцов таблицы, например: по количеству, порядку или типу данных. Дополнительные сведения см. в разделе "Формат файлов для импорта или экспорта данных" (SQL Server).

J. Указание кодовой страницы

В следующем частичном примере кода показан импорт bcp с указанием кодовой страницы 65001.

bcp MyTable in "D:\data.csv" -T -c -C 65001 -t , ...

K. Пример выходного файла с помощью настраиваемых полей и терминаторов строк

В этом примере показаны два примера файлов, созданных bcp с помощью настраиваемых полей и терминаторов строк.

  1. Создайте таблицу dbo.T1 в tempdb базе данных с двумя столбцами ID и Name.

    USE tempdb;
    GO
    
    CREATE TABLE dbo.T1
    (
        ID INT,
        [Name] NVARCHAR (20)
    );
    GO
    
    INSERT INTO dbo.T1 VALUES (1, N'Natalia');
    INSERT INTO dbo.T1 VALUES (2, N'Mark');
    INSERT INTO dbo.T1 VALUES (3, N'Randolph');
    GO
    
  2. Создайте выходной файл из таблицы примера dbo.T1, используя пользовательский разделитель полей.

    В этом примере -t , указывает разделитель пользовательского поля. Замените <server_name> значением для вашей среды.

    bcp dbo.T1 out T1.txt -T -S <server_name> -d tempdb -w -t ,
    

    Вот результат.

    1,Natalia
    2,Mark
    3,Randolph
    
  3. Создайте файл вывода на основе таблицы dbo.T1, используя заданный разделитель полей и заданный разделитель строк.

    В этом примере -t , указывает пользовательский терминатор поля, а -r : указывает пользовательский разделитель строк. Замените <server_name> на значение, соответствующее вашей среде.

    bcp dbo.T1 out T1.txt -T -S <server_name> -d tempdb -w -t , -r :
    

    Вот результат.

    1,Natalia:2,Mark:3,Randolph:
    

    Note

    Терминатор строки всегда добавляется даже к последней записи. Однако терминатор поля не добавляется в последнее поле.

Дополнительные примеры

В следующих статьях приведены примеры использования bcp:

Получите помощь

Примите участие в разработке документации по SQL

Знаете ли вы, что содержимое SQL можно изменить самостоятельно? При этом вы не только помогаете улучшить нашу документацию, но и получаете признание в качестве участника страницы.

Дополнительные сведения см. в разделе Редактирование документации Microsoft Learn.