【问题标题】:BCP Sybase ASE to SQL Server - Custom Field DelimiterBCP Sybase ASE 到 SQL Server - 自定义字段分隔符
【发布时间】:2017-11-25 01:51:57
【问题描述】:

我目前正在尝试将 BCP 从 Sybase ASE 数据库 (15.7) 转入 BCP 转入 SQL Server (2016)。所有 BCP 任务都在 Windows 环境中运行。

由于我有带有 CRLF 字符的记录,我需要指定一个自定义记录终止符来解决这个问题。我想使用的终止符是“~\t\t\t\t\t~\r\n”。为了便于阅读,我添加了 CRLF 字符,以防我需要打开文件。 Out命令如下:

bcp database..table out table.dat -Sserver -Uuser -Ppassword -c -t "|\t\t\t\t\t|" -r "~\t\t\t\t\t~\r\n"

当我 BCP 返回 SQL Server 时,我收到“字符串数据,右截断错误”。命令如下:

bcp database..table in table.dat -SServer -T -c -t "|\t\t\t\t\t|" -r "~\t\t\t\t\t~r\n"

我正在使用 BCP 的 ASE 15.7 SP126 版本。 我正在使用 SQL Server 2016 版本的 BCP (13.0.1601.5) for in。

基于线程here,我确定问题出在用于-r 选项的\r\n 字符上。如果我只在 out 上使用 -r "\r\n" 并在 in 上使用 -r "0x0a" 进行测试,它可以工作(除了在数据中有 CRLF 的记录上失败)。

只要我删除了 out 和 in 上的 \r\n 字符,我就可以成功地 BCP in 数据。

有谁知道我是否可以使用可打印字符 + CRLF 的组合?

干杯。

【问题讨论】:

    标签: sql-server sap-ase sql-server-2016 bcp


    【解决方案1】:

    如果您使用 MSSQL 的 bcp 从 ASE 中提取数据,您可能需要考虑使用 ASE 的 bcp 从 ASE 中提取数据,以排除两个程序之间的任何问题。 [请参阅此线程 - Sybase bcp vs MSSQL bcp - 了解详情;特别注意评论:They definitely do not handle output to a file the same way and the docs for each show that.]

    为什么坚持在终结符中使用 CRLF(以及在较小程度上所有的 \t)?任何您不能使用您知道不会出现在数据中的其他可打印字符组合的原因,例如:

    bcp ... -t"|&" -r "|&&" ...
    bcp ... -t"##&&" -r "||&&" ... 
    

    【讨论】:

    • 对不起 - 应该提到这一点。我正在使用 BCP (15.7 SP126) 的 ASE 版本。我会更新OP。至于使用 CRLF,纯粹是为了可读性。至于标签,我尝试了其他字符的组合,但发现我在一些散列字段中有错误的匹配。标签是组织中的其他人建议的,所以我同意了。
    • 缺少跟踪违规记录、查看实际数据 (od -c) 并确定是哪个字段产生了错误......并且从测试中知道删除 CRLF 字符可以修复问题...我可能会删除 CRLF 字符以立即解决;那么当我有空闲时间时,我可能会更仔细地研究这个问题(如果只是作为一个学习练习)
    • 谢谢,是的,这就是当前的解决方案。我想得越多,我就越认为文件被人类读取的机会很小,所以它可能不是问题(我见过的最大的是 35GB)。如果我必须打开一个,我只需要用一些东西捣碎它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多