我正在尝试从SQL Server导出到Oracle,该表由一个ID和一个存储为nvarchar(max)的非常长的XML字符串组成。
SQL Table -- CREATE TABLE MyStuff (MyID int, MyText nvarchar(max))
Oracle Table -- CREATE TABLE MyStuffImported (MyID int, MyText NCLOB)
我正在使用SQL Server bcp实用程序导出到文本文件(MyStuff.bcp),然后我通过SQL Loader将其导入Oracle。但SQL Loader失败并显示以下消息:“数据文件中的物理记录(MyStuff.bcp)长于最大值(1048576)”并导入0条记录。
我不确定究竟是什么问题。最明显的可能性是MyText比最大值1048576更长,确实有些记录,但不是全部,所以为什么至少有一些记录没有被导入?是否有办法绕过这个限制?
另一种可能性是我在一些讨论板上看到的,即MyText中存在Oracle无法处理的换行符。我希望我已经通过以下方法解决了这个问题:(1)从SQL导出时删除\ r和\ n,以及(2)在SQL Loader控制文件的记录分隔符中使用\ n(参见下面的完整文件) 。我做错了什么,或者没有处理所有案件?
这是我的SQL Loader控制文件的文本。请注意,我使用\作为分隔符,这似乎很奇怪,但它是MyText字段中未使用的唯一字符。因此,你会看到\\
我的意思是\因为我正在逃避它。
LOAD DATA
INFILE "MyStuff.bcp" "str '\\\n'"
APPEND INTO TABLE MyStuffImported
(
MyID INTEGER EXTERNAL TERMINATED BY "\\",
MyText CHAR TERMINATED BY "\\"
)
有什么建议吗?也许有更好的方法通过SQL Loader导入NCLOB?
答案 0 :(得分:1)
我能够通过执行以下操作来解决问题:
1)在sqlldr上设置READSIZE和BINDSIZE参数以更改最大限制1048576(绕过“数据文件中的物理记录...超过最大值”错误)
2)在我的控制文件中,在CHAR上设置一个特定的长度(绕过“数据文件中的字段超过最大长度”错误)。见下文:
LOAD DATA
INFILE "MyStuff.bcp" "str '\\\n'"
APPEND INTO TABLE MyStuffImported
(
MyID INTEGER EXTERNAL TERMINATED BY "\\",
MyText CHAR(10000000) TERMINATED BY "\\"
)
答案 1 :(得分:0)
我敢打赌你没有在每条记录之后提交,所以一旦你收到错误并且SQL Loader失败,它就会回滚你以前的插入。