指定字段终止符和行终止符

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

重要说明重要提示

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

可用作终止符的字符

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

终止字符

表示方法

制表符

\t

这是默认的字段终止符。

换行符

\n

这是默认的行终止符。

回车符/换行符

\r

反斜杠1

\\

空终止符(不可见终止符)2

\0

任何可打印的字符(控制字符是不可打印的,除空值、制表符、换行符和回车之外)

(*、A、t、l 等)

最长可达 10 个可打印字符的字符串,包括上面列出的部分或全部终止符

(**\t**、end、!!!!!!!!!!、\t—\n 等)

1 只有 t、n、r、0 和 '\0' 字符与反斜杠转义字符一起使用才能生成控制符。

2 即使在打印时空控制字符 (\0) 不可见,它在数据文件中仍然是一个独特的字符。这表示使用空控制字符作为字段终止符或行终止符与根本没有字段终止符或行终止符是不同的。

重要说明重要提示

如果数据中出现终止符字符,则它被视为终止符(而非数据),并且该字符后的数据被视为属于下一个字段或记录。因此,请仔细选择您的终止符,以确保它们从未出现在您的数据中。

使用行终止符

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

注意注意

交互使用 bcp 并指定 \n(换行符)作为行终止符时,bcp 将自动以 \r(回车符)作为前缀,从而形成行终止符 \r\n。

指定大容量导出的终止符

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

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

    注意注意

    有关如何使用格式化文件的信息,请参阅用来导入或导出数据的格式化文件

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

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

    • 使用字符格式开关 -c-w 而不是 -t 开关将字段终止符设置为制表符 \t。这相当于指定 -t\t。

      注意注意

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

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

      Enter field terminator [none]:

      通常,默认设置是适当的选择。但是,有关 char 或 nchar 数据字段,请参阅下一节“使用终止符指南”。有关在上下文中显示此提示的示例,请参阅使用 bcp 指定数据格式以获得兼容性

      注意注意

      在交互指定 bcp 命令中的所有字段后,该命令会提示您将自己对每个字段的响应保存在一个非 XML 格式化文件中。有关非 XML 格式化文件的详细信息,请参阅了解非 XML 格式化文件

使用终止符指南

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

示例

此示例使用字符格式将数据从 AdventureWorksHumanResources.Department 表大容量导出到 Department-c-t.txt 数据文件中,并以逗号作为字段终止符,以换行符 (\n) 作为行终止符。有关此表的详细信息,请参阅 Department 表 (AdventureWorks)

bcp 命令包含以下开关。

开关

说明

-c

指定将数据字段作为字符数据加载。

-t,

将逗号 (,) 指定为字段终止符。

-r \n

指定行终止符作为换行符。这是默认的行终止符,因此将其指定为可选。

-T

指定 bcp 实用工具通过使用集成安全性的受信任连接连接到 SQL Server。如果未指定 -T,则需要指定 -U-P 才能成功登录。

有关详细信息,请参阅 bcp 实用工具

在 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'

    指定用于字符和 Unicode 字符数据文件的字段终止符。

    默认的字段终止符是 \t(制表符)。

    ROWTERMINATOR ='row_terminator'

    指定用于字符和 Unicode 字符数据文件的行终止符。

    默认的行终止符是 \n(换行符)。

    有关详细信息,请参阅BULK INSERT (Transact-SQL)

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

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

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

示例

本部分的示例将字符数据从上述示例中创建的 Department-c-t.txt 数据文件大容量导入到 AdventureWorks 示例数据库的 myDepartment 表中。必须先创建此表,才能运行这些示例。若要在 dbo 架构下创建此表,请在 SQL Server Management Studio 查询编辑器中执行以下代码:

USE AdventureWorks;
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

A. 使用 bcp 交互指定终止符

以下示例使用 bcp 命令大容量导入 Department-c-t.txt 数据文件。该命令与大容量导出命令使用相同的命令开关。有关详细信息,请参阅本主题前面的“为大容量导出指定终止符”。

在 Windows 命令提示符下输入:

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

B. 使用 BULK INSERT 交互指定终止符

以下示例使用 BULK INSERT 语句大容量导入 Department-c-t.txt 数据文件,该语句使用了下表中所示的限定符。

选项

属性

DATAFILETYPE ='char'

指定将数据字段作为字符数据加载。

FIELDTERMINATOR =','

将逗号 (,) 指定为字段终止符。

ROWTERMINATOR ='\n'

指定行终止符作为换行符。

在 SQL Server Management Studio 查询编辑器中,执行以下代码:

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