【问题标题】:creating a SSIS package with a SQL query to Oracle使用对 Oracle 的 SQL 查询创建 SSIS 包
【发布时间】:2018-08-30 12:54:58
【问题描述】:

我已经使用了 SQL Server 2012 64 位!

我正在创建一个带有对 Oracle 的 SQL 查询的 SSIS 包,并尝试将文件放入一个平面文件中。我正在使用 Oracle OLEDB 源和平面文件目标作为输出。在本地一切正常,但是当放在服务器上并通过 SQL 代理运行时,我不断收到 Unicode 到非 unicode 错误!

最新的驱动程序在服务器上,11g 客户端在我的开发机器上。每个步骤中显示的类型显示为 DT-STR。

我有完全相同的源写入 OLEDB 目的地就好了。我不想把这些写到桌子上然后把它们拉出来只是为了让它工作。有什么解决办法吗?请不要“只添加这个”回复。

我尝试了数据转换,但得到了相同的结果。请在此处提供详细的答案并将其更改为此。图片永远不会受伤。谢谢

【问题讨论】:

  • 如果您收到 Unicode 到非 Unicode 警告,您可能需要使用 DT_WSTR(支持 Unicode),您的问题似乎很小,只是与类型转换有关。 Oracle VARCHAR 默认支持 Unicode,而 Microsoft SQL Server/SSIS 有 VARCHAR/NVARCHAR 或 DT_STR/DT_WSTR 用于非 unicode,unicode
  • 对免费帮助网站的要求很高!祝你好运。

标签: sql-server oracle ssis


【解决方案1】:

简短的回答是您需要转换代码页,而不是数据类型。

长答案如下:

第 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 之前进行了转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 2012-06-12
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多