Sql server 使用对Oracle的SQL查询创建SSIS包

Sql server 使用对Oracle的SQL查询创建SSIS包,sql-server,oracle,ssis,Sql Server,Oracle,Ssis,我已经对SQL Server 2012 64位版本有点厌倦了 我正在创建一个SSIS包,其中包含对Oracle的SQL查询,并尝试将该文件放入平面文件中。我使用Oracle OLEDB源和平面文件目标作为输出。在本地一切正常,但当放在服务器上并通过SQL代理运行时,我会不断地得到Unicode到非Unicode的错误 最新的驱动程序在服务器上,11g客户端在我的开发机器上。每个步骤中显示的类型显示为DT-STR 我有完全相同的源代码写入OLEDB目的地。我不想把它们写在桌子上,然后再把它们拿出来

我已经对SQL Server 2012 64位版本有点厌倦了

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

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

我有完全相同的源代码写入OLEDB目的地。我不想把它们写在桌子上,然后再把它们拿出来让它工作。有什么解决办法吗?请不要回答“只需添加此项”


我尝试了数据转换,但得到了相同的结果。请提供详细答案,如“转到此处”中所示,并将此更改为“此”。照片永远不会伤害你。谢谢

简而言之,您需要转换代码页,而不是数据类型

答案如下:

步骤0:如果您还没有使用它,我强烈建议您改用Attunity连接器,而不是Oracle OLEDB连接器。您可以从Microsoft下载SQL2012版本,网址为:

步骤1:使用Attunity Oracle源代码,您可以指定SQL命令作为数据访问模式,而不仅仅是指向表

步骤2:您需要确定Oracle server正在使用的确切代码页,以及SQL server正在使用的确切代码页。对于使用UTF-8字符集的Oracle服务器,这很可能是
AL32UTF8
,对于使用默认ANSI-1252字符集的Windows服务器,代码页是
WE8MSWIN1252

步骤3:编写plsql查询并转换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命令文本。

有趣的事实:Oracle将返回所有大写的列名,而不管您的
格式是ColumnName
格式


步骤5(可选):所有列都将作为字符串返回。您可能希望在数据流中放入
数据转换
任务,但如果您只是将数据转储到平面文件中,则可能不关心数据转换。我的数据集中有十进制/数字和日期,因此我在插入SQL Server之前进行转换。

如果您收到Unicode到非Unicode警告,您可能需要使用DT_WSTR(支持Unicode),您的问题似乎很小,只是与类型转换有关。默认情况下,Oracle VARCHAR支持Unicode,而Microsoft SQL Server/SSIS为非Unicode、Unicode要求的免费帮助站点请求提供了VARCHAR/NVARCHAR或DT_STR/DT_WSTR!祝你好运