数据中的 BCP 转义 \n

BCP escape \n in data

我正在使用 BCP 从 SQL 服务器下载数据,使用 queryout 选项。

但是,我注意到,如果任何列的数据内容包含'\n',则从BCP导出的内容将被视为换行。

例如SQL服务器中的数据为:

COLUMN_1 COLUMN_2
AAA NAME\nSURNAME
BBB NAMESURNAME

导出的文件如下:

AAA NAME
SURNAME
BBB NAMESURNAME

参考BCP文档,据我了解,-c不应该把\n当作换行符。

-c Performs the operation using a character data type. This option does not prompt for each field; it uses char as the storage type, without prefixes and with \t (tab character) as the field separator and \r\n (newline character) as the row terminator. -c is not compatible with -w.

我不确定我误解了什么。

这是我使用的命令:

bcp "select [col_name] from [table_name] where [condition]" queryout test.dat -U[username] -P[password] -S[serverip.port] -c

谢谢。

我假设您的文本包含实际的 \n 控制字符,而不是简单地包含彼此相邻的字符 \n

如果存在这种情况,那么您的选择是使用本机模式或将行终止符更改为 \n 以外的内容,以便它识别正确的模式。

我建议使用本机模式并测试它是否可以在 \n 就位的情况下正确地重新导入数据。

如果您的数据包含换行符或 crlf 控制字符,那么这些字符自然会包含在复制出的数据中。

控制字符应该在那里吗?如果是这样,那就留下它们,它们将被导入到您的目的地。仅仅因为您的文本视图显示 "broken" 行,并不意味着 SQL 服务器无法再次摄取该行并将控制字符隐藏在数据中(同样,如果这些控制字符属于那里......我见过很多这样的情况。

如果不需要换行符“\n”(或与此相关的任何控制字符),那么只需按照您在 Martin 的回答中评论的方式进行即可。只需在查询数据之前 ("update") 或在查询期间(如您用 "select/replace" 评论的那样)或在复制数据之后清理数据。

我过去曾使用 "file cleaner" 应用程序来 "clean" 一个包含不需要字符的文件(这可能是长期存在的数据或已遍历各种平台的数据的问题被人类感动了!!!呸!)。