简短的回答是您需要转换代码页,而不是数据类型。
长答案如下:
第 0 步:如果您还没有使用它,我强烈建议您改用 Attunity 连接器,而不是使用现有的 Oracle OLEDB 连接器。您可以从 Microsoft 为 SQL2012 下载它:https://www.microsoft.com/en-us/download/details.aspx?id=29283
第1步:使用Attunity Oracle Source,您可以指定一个SQL命令作为数据访问模式,而不是仅仅指向一个表。
第 2 步:您需要确定 Oracle 服务器正在使用的确切代码页,以及您的 SQL 服务器正在使用的确切代码页。对于使用 UTF-8 字符集的 Oracle 服务器,这很可能是 AL32UTF8,对于使用默认 ANSI-1252 字符集的 Windows 服务器,代码页是 WE8MSWIN1252。
第 3 步:编写您的 plsql 查询和 CONVERT Oracle 端所有列的代码页。确保在 Oracle 列名周围使用双引号。它应该看起来像这样:
SELECT
CONVERT("Data Source Code",'AL32UTF8','WE8MSWIN1252') AS DataSourceCode
,CONVERT("Order#",'AL32UTF8','WE8MSWIN1252') AS OrderNumber
,CONVERT("Invoice#",'AL32UTF8','WE8MSWIN1252') AS InvoiceNumber
,CONVERT("Item#",'AL32UTF8','WE8MSWIN1252') AS ItemNumber
,CONVERT("Order Line Type",'AL32UTF8','WE8MSWIN1252') AS OrderLineType
,CONVERT("Order Status",'AL32UTF8','WE8MSWIN1252') AS OrderStatus
,CONVERT("Order Date",'AL32UTF8','WE8MSWIN1252') AS OrderDate
,CONVERT("Invoice Date",'AL32UTF8','WE8MSWIN1252') AS InvoiceDate
,CONVERT("Ship To Cust#",'AL32UTF8','WE8MSWIN1252') AS ShipToCustNumber
,CONVERT("Billing Account #",'AL32UTF8','WE8MSWIN1252') AS BillingAccountNumber
,CONVERT("Sold Qty",'AL32UTF8','WE8MSWIN1252') AS SoldQty
,CONVERT("Unit Price",'AL32UTF8','WE8MSWIN1252') AS UnitPrice
,CONVERT("Sales Amount",'AL32UTF8','WE8MSWIN1252') AS SalesAmount
,CONVERT("Handling Amount",'AL32UTF8','WE8MSWIN1252') AS HandlingAmount
,CONVERT("Freight Amount",'AL32UTF8','WE8MSWIN1252') AS FreightAmount
FROM MYORACLEDB.DIGITAL_SALES_FEED
WHERE "Invoice Date" >= TO_DATE('2018/08/01', 'yyyy/mm/dd')
第 4 步:将此查询文本用作 Oracle 源配置窗口中的 SQL command text。
有趣的事实:无论您的AS ColumnName 格式如何,Oracle 都会返回全部大写的列名。
第 5 步(可选):所有列都将作为字符串返回。您可能想在数据流中放置一个Data Conversion 任务,但如果您只是将数据转储到平面文件中,您可能不关心数据转换。我的数据集中有小数/数字和日期,所以我在插入 SQL Server 之前进行了转换。