我们有一个Oracle表,其中包含表格格式的归档数据:
BLOB | BLOBID
每个BLOB都是一个XML文件,其中包含我们需要的所有业务对象 .
需要读取每个BLOB,解析XML并将其放入1个将保存所有数据的SQL Server表中 .
该表有5列 R | S | T | D | BLOBID
从BLOB派生的示例XML:
<N>
<E>
<R>33</R>
<S>1</S>
<T>2012-01-25T09:48:43.213</T>
<D>6.9534619e+003</D>
</E>
<E>
<R>33</R>
<S>1</S>
<T>2012-01-25T09:48:45.227</T>
<D>1.1085871e+004</D>
</E>
<E>
<R>33</R>
<S>1</S>
<T>2012-01-25T09:48:47.227</T>
<D>1.1561764e+004</D>
</E>
</N>
有几百万个BLOB,我们希望避免将所有数据作为XML列复制到表中,而是希望一步将BLOB复制到表中 .
使用SSIS / SQL Server执行此操作的最佳方法是什么?
下面的代码几乎完成了我们正在寻找的内容,但仅限于Oracle Developer,并且只针对一个BLOB:
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='yyyy-mm-dd HH24:MI:SS.FF';
SELECT b.BLOBID, a.R as R, a.S as S, a.T as T, cast(a.D AS float(23)) as D
FROM XMLTABLE('/N/E' PASSING
(SELECT xmltype.createxml(BLOB, NLS_CHARSET_ID('UTF16'), null)
FROM CLOUD --Oracle BLOB Cloud
WHERE BLOBID = 23321835)
COLUMNS
R int PATH 'R',
S int PATH 'S',
T TIMESTAMP(3) PATH 'T',
D VARCHAR(23) PATH 'D'
) a
删除 WHERE BLOBID = 23321835
会出现以下错误 ORA-01427: single-row subquery returns more than one row
,因为有数百万个BLOBS . 即便如此,有没有办法通过SSIS运行?将SQL添加到OLE DB源无法从Oracle中提取数据,即使是1 BLOB也会导致错误 .
使用SQL Server 2012和Oracle 10g
To summarize, how would we go from a Oracle BLOB containing XML to SQL Server table with business objects derived from XML with SSIS?
我是Oracle的新手,任何帮助都将不胜感激!
Update:
通过修改SSIS中的Oracle Source以使用上面的SQL命令代码减去第一行,我能够使我的一些代码在SSIS中工作,
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='yyyy-mm-dd HH24:MI:SS.FF';
SSIS不喜欢这条线 .
上面包含ALTER SESSION行的错误消息包括:
No column information was returned by the SQL Command
是否有另一种方式来格式化日期而不会丢失数据?我将尝试更多,可能使用varchar(23)作为日期而不是时间戳 .