我们有一个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)作为日期而不是时间戳 .