Указание разделителей полей и строк (SQL Server)
Применимо к:SQL Server
База данных SQL Azure
Управляемый экземпляр SQL Azure
Azure Synapse Analytics
Аналитическая платформа система (PDW)
Для символьных полей данных можно использовать необязательные символы, которые позволяют указывать конец каждого поля в файле данных с помощью разделителя поля и конец каждой строки с помощью разделителя строки. Один из способов указать программам, считывающим файл данных, где заканчивается одно поле или строка и начинается другое поле или строка, заключается в использовании завершающих символов.
Внимание
При использовании нативного формата или нативного формата в кодировке Юникод используйте префиксы длины вместо разделителей полей. Данные собственного формата могут конфликтуть с терминаторами, так как файл данных собственного формата хранится в формате внутренних двоичных данных Microsoft SQL Server.
Символы, поддерживаемые в качестве разделителей
Команда bcp, оператор BULK INSERT и поставщик больших наборов строк OPENROWSET поддерживают различные символы в качестве разделителей поля или строки и всегда ищут первое вхождение каждого разделителя. В следующей таблице перечислены поддерживаемые символы для разделителей.
Завершающий символ | Обозначается как |
---|---|
Вкладка | \t Признак конца поля по умолчанию. |
Символ перевода строки | \n Это символ окончания строки по умолчанию. |
Возврат каретки и перевод строки | \r |
Обратная косая черта* | \| |
Знак завершения NULL (невидимый знак завершения)** | \0 |
Любой печатаемый символ (управляющие символы, за исключением символа NULL, символов табуляции, перевода строки и возврата каретки, являются непечатными) | (*, A, t, l и т. д.) |
Строка, содержащая до десяти печатных символов, включая некоторые или все из ранее перечисленных терминаторов. | (**\t**, end, !!!!!!!!!, \t-\n и т. д.) |
*Для обозначения управляющего символа с escape-символом обратной косой черты используются только знаки t, n, r, 0 и "\0".
**Хотя управляющий символ NULL (\0) не виден при печати, он является отдельным знаком в файле данных, то есть если управляющий символ NULL используется в качестве признака конца поля или строки, то это не то же самое, что и полное отсутствие признака конца.
Внимание
Если символ завершения содержится в данных, он интерпретируется как завершение, а не как данные, и данные после этого символа интерпретируются как относящиеся к следующему полю или записи. Поэтому выбирайте знаки окончания или разделители так, чтобы они никогда не встречались в ваших данных. Например, младший символ-заместитель признака конца поля не рекомендуется использовать в качестве признака конца поля, если этот младший символ-заместитель содержится в данных.
Используйте терминаторы строк
Признаком конца строки может быть тот же символ, что и символ конца последнего поля. Однако, как правило, отдельный терминатор строки полезен. Например, для создания табличного вывода завершайте последнее поле в каждой строке символом новой строки (\n), а все остальные поля — символом табуляции (\t). Переносите каждую запись данных на свою собственную строку в файле данных, указывая сочетание \r\n в качестве признака конца строки.
Примечание.
Если при использовании bcp в интерактивном режиме в качестве признака конца строки задан знак \n (перевод строки), bcp автоматически добавляет к ней префикс \r (возврат каретки), в результате чего формируется признак конца строки \r\n.
Задайте терминаторы для массового экспорта
При массовом экспорте данных типа char или nchar , если необходимо использовать знак завершения, отличный от назначенного по умолчанию, определите его для команды bcp . Вы можете указать терминаторы одним из следующих способов:
С помощью файла формата, который указывает терминатор для каждого поля отдельно.
Примечание.
Сведения об использовании файлов форматирования см. в разделе "Формат файлов" для импорта или экспорта данных (SQL Server).
Существуют также следующие возможности без использования файла форматирования:
Указать параметр -t , задающий признак конца поля для всех полей, за исключением последнего поля в строке, и параметр -r , задающий признак конца строки.
Указать параметр символьного формата (-c или -w) без параметра -t , который задает в качестве признака конца поля знак табуляции \t. Это аналогично указанию -t\t.
Примечание.
Если указан параметр -n (данные в собственном формате) или -N (данные в собственном формате в кодировке Юникод), то признаки конца полей и строк не вставляются.
Если интерактивная команда bcp содержит параметр in или out без указания параметра файла форматирования (-f) или параметра формата данных (-n, -c, -w, или -N), и если вы решили не указывать длину префикса и длину поля, команда предлагает пользователю указать разделитель полей для каждого поля, причем по умолчанию он отсутствует.
Enter field terminator [none]:
Обычно подходящим выбором является значение по умолчанию. Однако для полей данных char или nchar см. следующий подраздел "Рекомендации по использованию терминаторов". Пример, показывающий этот запрос в контексте, см. в разделе "Указание форматов данных для совместимости при использовании bcp (SQL Server)".
Примечание.
После интерактивного заполнения всех полей в команде bcp появится запрос на сохранение введенных ответов для каждого поля в файле форматирования в формате, отличном от XML. Дополнительные сведения о файлах форматирования, отличных от XML, см. в разделе "Файлы форматирования, отличные от XML" (SQL Server).
Рекомендации по использованию терминаторов
В некоторых ситуациях для данных типа char или nchar может быть полезен терминатор. Например:
Для столбца данных, содержащего значение NULL в файле данных, который будет импортирован в программу, не распознающую сведения о длине префикса.
Любой столбец данных, содержащий значение NULL, считается столбцом переменной длины. В отсутствие сведений о длине префикса признак конца необходим, чтобы указать конец поля NULL и удостовериться, что данные интерпретируются верно.
Длинный столбец фиксированной длины, пространство которого лишь частично используется многими строками.
В этой ситуации указание терминатора может минимизировать объем хранилища, что позволит обрабатывать поле как поле переменной длины.
Укажите \n
как завершающий символ строки для экспорта данных оптом
Когда вы определяете \n
как символ конца строки при массовом экспорте или неявно используете такой символ по умолчанию, bcp выводит комбинацию символов возврата каретки и перевода строки как символ конца строки. Чтобы указать только символ перевода строки (LF) как символ конца строки — как это принято на компьютерах Unix и Linux — используйте шестнадцатеричную нотацию для его указания. Например:
bcp -r '0x0A'
Примеры
В этом примере выполняется массовый экспорт данных из таблицы AdventureWorks.HumanResources.Department
в файл данных Department-c-t.txt
в символьном формате с запятой в качестве признака конца поля и знаком новой строки (\n) в качестве признака конца строки.
Команда bcp поддерживает следующие параметры.
переключатель | Описание |
---|---|
-c | Указывает, что поля данных должны загружаться как символьные данные. |
-t, |
Задает запятую (,) в качестве разделителя поля. |
-r \n | Задает в качестве признака конца строки символ перевода строки. Это признак конца строки по умолчанию, поэтому его задание необязательно. |
-T | Указывает, что служебная программа bcp подключается к SQL Server с использованием доверенного подключения и интегрированной безопасности. Если параметр -T не указан, для входа необходимо указать -U и -P . |
Дополнительные сведения см. в разделе bcp Utility.
В командной строке Microsoft Windows введите следующее:
bcp AdventureWorks.HumanResources.Department out C:\myDepartment-c-t.txt -c -t, -r \n -T
В результате этого будет создан файл Department-c-t.txt
, содержащий 16 записей, каждая из которых имеет четыре поля. Поля разделены с помощью символа запятой.
Определите терминаторы для массового импорта
При массовом импорте данных типа char или nchar команда должна распознавать разделители, используемые в файле данных. В зависимости от команды массового импорта терминаторы могут устанавливаться следующим образом:
bcp
Указание терминаторов для операции импорта использует тот же синтаксис, что и для операции экспорта. Дополнительные сведения см. в разделе «Задание терминаторов для массового экспорта» ранее в этом разделе.
BULK INSERT
Разделители в формате файла могут быть указаны как для отдельных полей, так и для всего файла данных при помощи квалификаторов, приведенных в следующей таблице.
Квалификатор Описание FIELDTERMINATOR ='field_terminator' (признак_конца_поля) Задает разделитель полей, используемый для символьных файлов данных и файлов данных в кодировке Юникод.
Значением по умолчанию является \t (символ табуляции).ROWTERMINATOR ='row_terminator' Задает признак конца строки, используемый для символьных файлов данных и файлов в кодировке Юникод.
По умолчанию \n (символ перевода строки).Дополнительные сведения см. в разделе BULK INSERT (Transact-SQL).
Инструкции INSERT ... SELECT * FROM OPENROWSET(BULK...).
Для поставщика массовых наборов строк OPENROWSET признаки конца могут задаваться только в файле форматирования (который обязателен для всех типов данных, кроме типа данных больших объектов). Если в файле символьных данных используется терминатор, отличный от стандартного, он должен быть определен в форматном файле. Дополнительные сведения см. в разделе "Создание файла форматирования" (SQL Server) и использование файла форматирования для массового импорта данных (SQL Server).
Дополнительные сведения о предложении OPENROWSET BULK см. в статье OPENROWSET (Transact-SQL).
Укажите \n
в качестве конца строки для массового импорта
Когда вы указываете \n
как терминатор строки для массового импорта или используете его по умолчанию, bcp и оператор BULK INSERT ожидают, что терминатором строки будет комбинация возврата каретки и перевода строки (CRLF). Если в исходном файле используется только символ перевода строки (LF) как символ конца строки — как это обычно происходит в файлах, созданных на компьютерах Unix и Linux — используйте шестнадцатеричную нотацию для указания LF в качестве символа конца строки. Например, в инструкции BULK INSERT:
ROWTERMINATOR = '0x0A'
Примеры
В примерах, содержащихся в этом разделе, рассматривается массовый импорт символьных данных из файла данных 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 not NULL CONSTRAINT DF_AddressType_ModifiedDate DEFAULT (GETDATE())
);
GO
А. Используйте bcp для интерактивного указания терминаторов
В следующем примере выполняется массовый импорт файла данных Department-c-t.txt
при помощи команды bcp
. Эта команда использует те же самые параметры, что и команда массового экспорта. Дополнительные сведения см. в подразделе «Указание разделителей для массового экспорта» ранее в этом разделе.
В командной строке Windows введите:
bcp AdventureWorks2022..myDepartment in C:\myDepartment-c-t.txt -c -t , -r \n -T
B. Использование BULK INSERT для интерактивного указания терминаторов
В следующем примере производится массовый импорт файла данных Department-c-t.txt
инструкцией BULK INSERT
, которая использует квалификаторы, показанные в следующей таблице.
Вариант | Атрибут |
---|---|
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