Поделиться через


Указание терминаторов полей и строк (SQL Server)

Область применения:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)Конечная точка аналитики SQL в Microsoft FabricХранилище в Microsoft Fabric

Для символьных полей данных можно использовать необязательные символы, которые позволяют указывать конец каждого поля в файле данных с помощью разделителя поля и конец каждой строки с помощью разделителя строки. Один из способов указать программам, считывающим файл данных, где заканчивается одно поле или строка и начинается другое поле или строка, заключается в использовании завершающих символов.

Important

При использовании нативного формата или нативного формата в кодировке Юникод используйте префиксы длины вместо разделителей полей. Данные собственного формата могут конфликтуть с терминаторами, так как файл данных собственного формата хранится в формате внутренних двоичных данных Microsoft SQL Server.

Символы, поддерживаемые в качестве терминаторов

Команда bcp, оператор BULK INSERT и поставщик массового набора строк OPENROWSET поддерживают использование различных символов в качестве разделителей полей или строк и всегда ищут первое появление каждого разделителя. В следующей таблице перечислены поддерживаемые символы для разделителей.

Terminating character Indicated by Description
Tab \t Признак конца поля по умолчанию.
Newline character \n Это символ окончания строки по умолчанию.
Возврат каретки и перевод строки \r
Backslash 1 \
Терминатор NULL (невидимый терминатор) 2 \0
Любой печатный символ (управляющие символы не являются печатными, кроме нулевого символа, табуляции, новой строки и возврата каретки) (*, A, t, l, и т. д.)
Строка, содержащая до десяти печатных символов, включая некоторые или все из ранее перечисленных терминаторов. (**\t**, end, !!!!!!!!!!, \t-\n, и т. д.)

1 Только символы t, n, r, 0 и \0 работают с управляющим символом обратной косой черты, чтобы создать элемент управления.

2 Несмотря на то, что символ элемента управления NULL (\0) не отображается при печати, это отдельный символ в файле данных. то есть если управляющий символ NULL используется в качестве признака конца поля или строки, то это не то же самое, что и полное отсутствие признака конца.

Important

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

Используйте терминаторы строк

Признаком конца строки может быть тот же символ, что и символ конца последнего поля. Однако, как правило, отдельный терминатор строки полезен. Например, чтобы создать табличные выходные данные, завершите последнее поле в каждой строке символом новой строки (\n), а все остальные поля символом табуляции (\t). Чтобы разместить каждую запись данных в отдельной строке в файле данных, укажите сочетание \r\n в качестве конца строки.

Note

При интерактивном использовании bcp и указании \n (newline) в качестве конца строки bcp автоматически добавляет перед ним символ \r (возврат каретки), что приводит к созданию окончания строки \r\n.

Укажите разделители для массового экспорта

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

  • С помощью файла формата, который указывает терминатор для каждого поля отдельно.

    Note

    Сведения об использовании файлов форматирования см. в разделе "Формат файлов" для импорта или экспорта данных (SQL Server).

  • Существуют также следующие возможности без использования файла форматирования:

    • Используйте переключатель -t , чтобы указать терминатор поля для всех полей, кроме последнего поля в строке и с помощью -r переключателя, чтобы указать терминатор строки.

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

      Note

      Если указать ключ -n (исходные данные) или -N (исходный Юникод), то терминаторы не вставляются.

    • Если интерактивная команда bcp содержит параметр in или out, но не содержит параметр форматирования файла (-f) или параметры формата данных (-n, -c, -w или -N), и вы не указываете длину префикса и длину поля, тогда команда запрашивает разделитель полей для каждого поля, по умолчанию отсутствует:

      Enter field terminator [none]:

      Обычно подходящим выбором является значение по умолчанию. Однако для полей данных char и nchar, см. следующий подраздел "Рекомендации по использованию терминаторов". Пример, показывающий этот запрос в контексте, приведен в разделе «Указание форматов данных совместимости при использовании bcp (SQL Server)».

      Note

      После интерактивного заполнения всех полей в команде bcp появится запрос на сохранение введенных ответов для каждого поля в файле форматирования в формате, отличном от XML. Дополнительные сведения о файлах форматирования, отличных от XML, см. в разделе "Использование файлов форматирования, отличных от XML" (SQL Server).

Рекомендации по использованию терминаторов

В некоторых ситуациях для данных типа char или nchar может быть полезен терминатор. For example:

  • Для столбца данных, содержащего значение NULL в файле данных, который будет импортирован в программу, которая не понимает сведения о длине префикса.

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

  • Длинный столбец фиксированной длины, пространство которого лишь частично используется многими строками.

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

Укажите \n в качестве конца строки для массового экспорта

Когда вы определяете \n как символ конца строки при массовом экспорте или неявно используете такой символ по умолчанию, bcp выводит комбинацию символов возврата каретки и перевода строки как символ конца строки. Чтобы указать только символ перевода строки (LF) как символ конца строки — как это принято на компьютерах Unix и Linux — используйте шестнадцатеричную нотацию для его указания. For example:

bcp -r '0x0A'

Examples

В этом примере выполняется массовый экспорт данных из таблицы AdventureWorks2022.HumanResources.Department в файл данных Department-c-t.txt в символьном формате с запятой в качестве признака конца поля и знаком новой строки (\n) в качестве признака конца строки.

Команда bcp поддерживает следующие параметры.

Switch Description
-c Указывает, что поля данных должны загружаться как символьные данные.
-t , Задает запятую (,) в качестве разделителя поля.
-r \n Задает в качестве признака конца строки символ перевода строки. Это терминатор строк по умолчанию, поэтому указание его необязательно.
-T Указывает, что служебная программа bcp подключается к SQL Server с использованием доверенного подключения и интегрированной безопасности. Если -T не указано, необходимо указать -U и -P успешно войти в систему.

Дополнительные сведения см. в разделе bcp Utility.

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

bcp AdventureWorks2022.HumanResources.Department out C:\myDepartment-c-t.txt -c -t, -r \n -T

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

Укажите терминаторы для массового импорта

При массовом импорте данных типа char или nchar команда должна распознавать разделители, используемые в файле данных. В зависимости от команды массового импорта терминаторы могут устанавливаться следующим образом:

  • bcp

    Указание терминаторов для операции импорта использует тот же синтаксис, что и для операции экспорта. Дополнительные сведения см. в разделе "Указание терминаторов для массового экспорта" ранее в этой статье.

  • BULK INSERT

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

    Qualifier Description
    FIELDTERMINATOR = '<field_terminator>' Задает разделитель полей, используемый для символьных файлов данных и файлов данных в кодировке Юникод.

    Значение по умолчанию — \t (символ табуляции).
    ROWTERMINATOR = '<row_terminator>' Задает признак конца строки, используемый для символьных файлов данных и файлов в кодировке Юникод.

    Значение по умолчанию — \n (символ перехода на новую строку).

    Дополнительные сведения см. в статье BULK INSERT.

  • INSERT ... SELECT * FROM OPENROWSET(BULK...)

    Для поставщика массового набора строк разделители могут быть указаны только в файле форматирования (за исключением типов данных больших объектов, для которых он обязателен). Если в файле символьных данных используется терминатор, отличный от стандартного, он должен быть определен в форматном файле. Дополнительные сведения см. в разделе "Создание файла форматирования" (SQL Server) и использование файла форматирования для массового импорта данных (SQL Server).

    Дополнительные сведения о предложении OPENROWSET BULK см. в разделе OPENROWSET (BULK).

Укажите \n в качестве конца строки для массового импорта

Если вы указываете \n в качестве конца строки для массового импорта или неявно используете терминатор строк по умолчанию, то bcp и инструкция BULK INSERT ожидают комбинацию возврат каретки-перевод строки (CRLF) в качестве конца строки. Если исходный файл использует только символ перевода строки (LF) в качестве разделителя строк, как обычно в файлах, созданных на компьютерах Unix и Linux, используйте шестнадцатеричную нотацию для указания разделителя строки LF. Например, в инструкции BULK INSERT :

ROWTERMINATOR = '0x0A'

Examples

В примерах, содержащихся в этом разделе, рассматривается массовый импорт символьных данных из файла данных Department-c-t.txt , созданного в предыдущем примере, в таблицу myDepartment образца базы данных AdventureWorks2022 . Перед выполнением примеров следует создать эту таблицу. Чтобы создать эту таблицу в схеме, в редакторе dbo запросов SQL Server Management Studio выполните следующий код:

USE AdventureWorks2022;
GO

DROP TABLE myDepartment;

CREATE TABLE myDepartment
(
    DepartmentID SMALLINT,
    Name NVARCHAR (50),
    GroupName NVARCHAR (50) NULL,
    ModifiedDate DATETIME CONSTRAINT
        DF_AddressType_ModifiedDate DEFAULT (GETDATE()) NOT NULL
);
GO

A. Используйте bcp для интерактивного указания терминаторов

В следующем примере выполняется массовый импорт файла данных Department-c-t.txt при помощи команды bcp . Эта команда использует те же самые параметры, что и команда массового экспорта. Дополнительные сведения см. в разделе "Указание терминаторов для массового экспорта" ранее в этой статье.

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

bcp AdventureWorks2022.dbo.myDepartment in C:\myDepartment-c-t.txt -c -t , -r \n -T

B. Использование BULK INSERT для интерактивного указания терминаторов

В следующем примере производится массовый импорт файла данных Department-c-t.txt инструкцией BULK INSERT , которая использует квалификаторы, показанные в следующей таблице.

Option Attribute
DATAFILETYPE = 'char' Указывает, что поля данных должны загружаться как символьные данные.
FIELDTERMINATOR = ',' Задает запятую (,) в качестве признака конца поля.
ROWTERMINATOR = '\n' Задает в качестве признака конца строки символ перевода строки.

В SQL Server Management Studio, Редактор запросов, выполните следующий код:

USE AdventureWorks2022;
GO

BULK INSERT myDepartment FROM 'C:\myDepartment-c-t.txt'
WITH (
     DATAFILETYPE = 'char',
     FIELDTERMINATOR = ',',
     ROWTERMINATOR = '\n'
);
GO