Sql server 数据中的BCP转义\n

Sql server 数据中的BCP转义\n,sql-server,bcp,sqlbulkcopy,Sql Server,Bcp,Sqlbulkcopy,我使用BCP从SQLServer下载数据,使用queryout选项 但是,我注意到,如果任何列中的数据内容包含“\n”,则从BCP导出的内容将被视为换行符 例如,如果SQL Server中的数据为: COLUMN_1 COLUMN_2 AAA NAME\nSURNAME BBB NAMESURNAME 导出的文件可能类似于: AAA NAME SURNAME BBB NAMESURNAME 请参阅BCP文档,据我所知,-c不应将\n视为换行符 -c 使用字符数据类型执行操作。此选项不会提示每

我使用BCP从SQLServer下载数据,使用queryout选项

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

例如,如果SQL Server中的数据为:

COLUMN_1 COLUMN_2
AAA NAME\nSURNAME
BBB NAMESURNAME
导出的文件可能类似于:

AAA NAME
SURNAME
BBB NAMESURNAME
请参阅BCP文档,据我所知,-c不应将\n视为换行符

-c 使用字符数据类型执行操作。此选项不会提示每个字段;它使用char作为存储类型,不带前缀,\t(制表符)作为字段分隔符,\r\n(换行符)作为行终止符-c与-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
到位的情况下重新正确导入数据。

我假设您的文本包含实际的
\n
控制字符,而不仅仅是相邻的字符
\
n

如果存在这种情况,则您可以选择使用本机模式或将行终止符更改为除
\n
以外的其他形式,以便识别正确的模式


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

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

控制字符应该在那里吗?如果是这样的话,那么离开它们,它们将被导入到您的目的地。仅仅因为您的文本视图显示了一条“断开”的行,并不意味着SQL Server无法再次接收该行并将控制字符隐藏在数据中(同样,如果这些控制字符属于该行……我已经看到很多情况下它们会出现)

如果不需要换行符“\n”(或该问题的任何控制字符),则只需按照您在Martin的回答中的注释执行即可。只需在查询数据之前(“更新”)或在查询过程中(如您用“选择/替换”注释)或在复制数据之后清理数据即可


我以前使用过“文件清理器”应用程序来“清理”文件中不需要的字符(这可能是长期存在的数据或已穿越各种平台或已被人类接触过的数据的问题!!!太棒了!)。

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

控制字符应该在那里吗?如果是这样的话,那么离开它们,它们将被导入到您的目的地。仅仅因为您的文本视图显示了一条“断开”的行,并不意味着SQL Server无法再次接收该行并将控制字符隐藏在数据中(同样,如果这些控制字符属于该行……我已经看到很多情况下它们会出现)

如果不需要换行符“\n”(或该问题的任何控制字符),则只需按照您在Martin的回答中的注释执行即可。只需在查询数据之前(“更新”)或在查询过程中(如您用“选择/替换”注释)或在复制数据之后清理数据即可


我以前使用过“文件清理器”应用程序来“清理”文件中不需要的字符(这可能是长期存在的数据或穿越各种平台或被人类接触过的数据的问题!!!太棒了!)。

我在
bcp“选择‘hello\nworld’”queryout test.txt-S(local)-t-c
中没有看到这种行为
type test.txt
按预期生成
hello\nworld
——不是换行符,而是分隔的\和n个字符。作为参考,我使用的是
C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\bcp.exe
,因为您的数据位于SQL Server中,如果您查询它,您真的会在数据中看到“\n”吗?或者,您的意思是在第一条记录中样本的“column2”中的值之间有一个“换行符”?这是一个重要的区别。如果您有两个字节的“\”和“n”(这不太可能)。。。那么这就更令人费解了。但是,如果您的意思是在列中的值之间有一个字节“\n”即ascii换行符,那么答案很简单。嗨@jamie,我仍然不理解“\n”和“\”以及“n”之间的区别?正如你提到的,解决这两个案例的方法是不同的(更令人困惑的一个和容易的一个)。你必须首先回答我前面的问题。当您查看SSMS中的数据时,是否确实看到“\n”?如果数据像您所说的那样包含控制字符,则除非您使用高质量的文本编辑器查看数据并告诉它显示控制字符,否则您将看不到数据。这些控制字符不可打印。它们在人类眼中并不存在。。。“\n”只是传递新行控制字符的一种方式。但是,如果您在SSMS的查询结果窗口中查看数据时确实看到了两个字符“\”和“n”,那么您就有一个奇怪的问题。我看不到使用
bcp“select'hello\nworld'”的行为。queryyout test.txt-S(local)-t-c
type test.txt
按预期生成
hello\nworld
——不是换行符,而是分隔的\和n个字符。作为参考,我使用的是
C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\bcp.exe
,因为您的数据位于SQL Server中,如果您查询它,您真的会在数据中看到“\n”吗?还是说有