使用 bcp 指定字段长度
字段长度指示以字符格式表示数据时所要求的最大字符数。如果数据以本机格式存储,则字段长度就是已知的,例如,int 数据类型占 4 个字节。如果指示前缀长度为 0,则 bcp 命令会提示输入字段长度、默认字段长度以及字段长度对包含 char 数据的数据文件中数据存储的影响。
bcp 提示输入字段长度
如果某个交互式 bcp 命令包含不带格式化文件开关 (-f) 或数据格式开关(-n、-c、-w 或 -N)的 in 或 out 选项,则该命令会提示输入每个数据字段的字段长度,如下所示:
Enter length of field <field_name> [<default>]:
有关在上下文中显示此提示的示例,请参阅使用 bcp 指定数据格式以获得兼容性。
注意 |
---|
在交互指定 bcp 命令中的所有字段后,该命令会提示您将自己对每个字段的响应保存在一个非 XML 格式化文件中。有关非 XML 格式化文件的详细信息,请参阅了解非 XML 格式化文件。 |
bcp 命令是否提示输入字段长度取决于若干因素,如下所示:
当复制没有固定长度的数据类型并指定前缀长度为 0 时,bcp 命令会提示输入字段长度。
当将非字符数据转换为字符数据时,bcp 会建议一个足以存储该数据的默认字段长度。
如果文件存储为非字符类型,则 bcp 命令不会提示输入字段长度。数据将以 MicrosoftSQL Server 本机数据表示形式(本机格式)存储。
使用默认字段长度
通常,Microsoft 会建议您接受 bcp 建议的默认字段长度值。如果已创建了字符模式数据文件,则使用默认字段长度可确保数据不会被截断,并且不会发生数字溢出错误。
如果指定的字段长度不正确,可能会发生问题。例如,当复制数字数据并且为该数据指定的字段长度过短时,bcp 实用工具将显示一条溢出消息而不复制数据。另外,当导出 datetime 数据并且为该字符串指定的字段长度少于 26 个字节时,bcp 实用工具将截断数据而不显示任何错误消息。
重要提示 |
---|
使用默认大小选项时,SQL Server 需要读取整个字符串。在某些情况下,使用默认字段长度可能导致“意外的文件结尾”错误。通常情况下,当使用 money 和 datetime 数据类型而数据文件中只出现了所需字段的一部分时,就会发生此类错误。例如指定了 mm/dd/yy 格式中的 datetime 值而没有指定时间部分,因而该值少于以 char 格式表示 datetime 值所需的 24 个字符。若要避免此类错误,请使用字段终止符或具有固定长度的数据字段,或者通过指定其他值来更改默认字段长度。 |
字符文件存储的默认字段长度
下表列出了要存储为字符文件存储类型的数据的默认字段长度。可为空值的数据与非空数据的长度相同。
数据类型 |
默认长度(字符数) |
---|---|
char |
定义的列长度 |
varchar |
定义的列长度 |
nchar |
定义的列长度的两倍 |
nvarchar |
定义的列长度的两倍 |
Text |
0 |
ntext |
0 |
bit |
1 |
binary |
定义的列长度的两倍 + 1 |
varbinary |
定义的列长度的两倍 + 1 |
image |
0 |
datetime |
24 |
smalldatetime |
24 |
float |
30 |
real |
30 |
int |
12 |
bigint |
19 |
smallint |
7 |
tinyint |
5 |
money |
30 |
smallmoney |
30 |
decimal |
41* |
numeric |
41* |
uniqueidentifier |
37 |
timestamp |
17 |
varchar(max) |
0 |
varbinary(max) |
0 |
nvarchar(max) |
0 |
UDT |
用户定义的字词 (UDT) 列长度 |
XML |
0 |
* 有关 decimal 和 numeric 数据类型的详细信息,请参阅 decimal 和 numeric (Transact-SQL)。
注意 |
---|
tinyint 类型的列的值介于 0 到 255 之间;表示该范围内的任意数值所需的最大字符数是三(用于表示 100 到 255 之间的值)。 |
本机文件存储的默认字段长度
下表列出了要存储为本机文件存储类型的数据的默认字段长度。可为空值的数据与非空数据的长度相同,并且字符数据始终以字符格式存储。
数据类型 |
默认长度(字符数) |
---|---|
bit |
1 |
binary |
定义的列长度 |
varbinary |
定义的列长度 |
image |
0 |
datetime |
8 |
smalldatetime |
4 |
float |
8 |
real |
4 |
int |
4 |
bigint |
8 |
smallint |
2 |
tinyint |
1 |
money |
8 |
smallmoney |
4 |
decimal1 |
* |
numeric1 |
* |
uniqueidentifier |
16 |
timestamp |
8 |
1 有关 decimal 和 numeric 数据类型的详细信息,请参阅 decimal 和 numeric (Transact-SQL)。
在上述所有情况中,若要创建日后要重新加载到 SQL Server 中的数据文件并使存储空间保持最小,请使用长度前缀,以及默认文件存储类型和默认字段长度。