指定字段和行终止符(SQL Server)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

对于字符数据字段,可选的终止字符允许在数据文件中使用“字段终止符”标记每个字段的结尾,以及使用“行终止符”标记每行的结尾。 终止字符是为读取数据文件的程序指明一个字段或行的结束位置和另一个字段或行的开始位置的一种方式。

重要

使用本机格式或 Unicode 本机格式时,请使用长度前缀而不要使用字段终止符。 本机格式数据可能与终止符冲突,因为本机格式数据文件以 Microsoft SQL Server 内部二进制数据格式进行存储。

支持作为终止符的字符

bcp 命令、BULK INSERT语句和OPENROWSET大容量行集提供程序支持各种字符作为字段或行终止符,并始终查找每个终止符的第一个实例。 下表列出了支持的终止符字符。

终止字符 表示方法 说明
选项卡 \t 这是默认的字段终止符。
换行符 \n 这是默认的行终止符。
回车符/换行符 \r
反斜杠 1 \
Null 终止符 (不可见终止符) 2 \0
任何可打印字符(控件字符不可打印,除了 null、制表符、换行符和回车符) *、、tAl、等)
最长可达 10 个可打印字符的字符串,包括上面列出的部分或全部终止符 **\t**、、!!!!!!!!!!end\t-\n、等)

1 只有t反斜杠转义字符使用反0nr\0斜杠转义字符,才能生成控件字符。

2 即使打印时 null 控制字符 (\0) 不可见,但它是数据文件中的非重复字符。 这表示使用空控制字符作为字段终止符或行终止符与根本没有字段终止符或行终止符是不同的。

重要

如果终止符字符发生在数据中,则字符被解释为终止符,而不是数据,该字符之后的数据被解释为属于下一个字段或记录。 因此,请仔细选择您的终止符,以确保它们从未出现在您的数据中。 例如,如果数据包含该低代理项,则字段终止符的低代理项字段终止符不是一个不错的选择。

使用行终止符

行终止符可以与最后一个字段的终止符相同。 但是,通常来说,非重复的终止符是很有用的。 例如,若要生成表格输出,请使用换行符()和具有制表符的\n所有其他字段终止每行中的最后一个字段(\t)。 若要将每个数据记录放在数据文件中自己的行上,请将组合 \r\n 指定为行终止符。

注意

以交互方式使用 bcp 并将 (newline) 指定 \n 为行终止符时, bcp 会自动为其 \r 添加前缀(回车符),这会导致行终止符为 \r\n

指定批量导出的终止符

批量导出 charnchar 数据,并且希望使用非默认终止符时,必须向 bcp 命令指定终止符。 可以用下列任一方式指定终止符:

  • 使用格式化文件逐个字段指定终止符。

    注意

    有关如何使用格式化文件的信息,请参阅格式化文件以导入或导出数据(SQL Server)。

  • 不使用格式化文件,但有下列可选方式:

    • -t使用开关为行中最后一个字段以外的所有字段指定字段终止符,并使用-r开关指定行终止符。

    • 使用不带开关的-t字符格式开关(-c-w),该开关将字段终止符设置为制表符。 \t 这与指定 -t\t相同。

      注意

      如果指定 -n (本机数据)或 -N (Unicode 本机)开关,则不会插入终止符。

    • 如果交互式 bcp 命令包含in格式文件开关()或数据格式开关(-n-f-w-N-c或)的或out选项,并且你选择不指定前缀长度和字段长度,则每个字段的字段终止符的命令提示符默认为 none:

      Enter field terminator [none]:

      通常,默认设置是适当的选择。 但是,对于 charnchar 数据字段,请参阅以下小节“使用终止符指南”。有关在上下文中显示此提示的示例,请参阅 使用 bcp(SQL Server)时指定兼容性数据格式

      注意

      在你以交互方式指定 bcp 命令中的所有字段后,该命令会提示你将自己对每个字段的响应保存到一个非 XML 格式化文件中。 有关非 XML 格式化文件的详细信息,请参阅使用非 XML 格式化文件(SQL Server)。

使用终止符指南

在某些情况下,终止符对 charnchar 数据字段是很有用的。 例如:

  • 对于包含数据文件中 null 值的数据列,该文件将导入到不了解前缀长度信息的程序中。

    包含 null 值的任何数据列都被认为是可变长度。 如果缺少前缀长度,则需要一个终止符来确定 null 字段的结尾,同时确保正确地解释数据。

  • 对于其空间只被许多行部分占用的固定长度的长列。

    在这种情况下,指定一个终止符可以最大限度地减少存储空间,同时可以将字段视为可变长度字段。

指定 \n 为批量导出的行终止符

当指定 \n 作为批量导出的行终止符,或隐式使用默认行终止符时,bcp 将输出回车符和换行符的组合 (CRLF),作为行终止符。 如果只想输出换行符 (LF) 作为行终止符(在 Unix 和 Linux 计算机上很典型),请使用十六进制表示法来指定 LF 行终止符。 例如:

bcp -r '0x0A'

示例

此示例使用字符格式将 AdventureWorks2022.HumanResources.Department 表中的数据批量导出至 Department-c-t.txt 数据文件,其中将逗号用作字段终止符,将换行符 (\n) 用作行终止符。

bcp 命令包含以下开关。

开关 说明
-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 条记录,每条记录有四个字段。 这些字段由逗号分隔。

指定批量导入的终止符

当批量导入 charnchar 数据时,批量导入命令必须识别数据文件中使用的终止符。 如何指定终止符依赖于大容量导入命令,如下所示:

  • bcp

    为导入操作指定终止符与为导出操作指定终止符的语法相同。 有关详细信息,请参阅本文前面部分 的“指定终止符进行批量导出”。

  • BULK INSERT

    可以使用下表所示的限定符为格式化文件中的各个字段或整个数据文件指定终止符。

    限定 符 说明
    FIELDTERMINATOR = '<field_terminator>' 指定用于字符和 Unicode 字符数据文件的字段终止符。

    默认为 \t(制表符)。
    ROWTERMINATOR = '<row_terminator>' 指定用于字符和 Unicode 字符数据文件的行终止符。

    默认值为 \n(换行符)。

    有关详细信息,请参阅 BULK INSERT

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

    OPENROWSET对于大容量行集提供程序,终止符只能在格式化文件中指定(除了大型对象数据类型除外)。 如果字符数据文件使用非默认终止符,则必须在格式化文件中定义该非默认终止符。 有关详细信息,请参阅创建格式化文件 (SQL Server)使用格式化文件批量导入数据 (SQL Server)

    有关子OPENROWSET BULK句的详细信息,请参阅 OPENROWSET (BULK)。

指定 \n 为批量导入的行终止符

如果指定 \n 为批量导入的行终止符,或隐式使用默认行终止符, bcpBULK 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 CONSTRAINT
        DF_AddressType_ModifiedDate DEFAULT (GETDATE()) NOT NULL
);
GO

答: 使用 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 数据文件,该语句使用了下表中所示的限定符。

选项 特征
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