2015-11-30 46 views
0

我有一个SQL Server Integration Services ETL项目从Oracle数据库获取数据。我正在使用连接管理器配置和工作的ODBC源组件。Oracle SSIS简单查询 - “文本不匹配格式字符串”

在ODBC源代码中,选择连接管理器后,我在下拉列表中获取所有表和视图。 问题是这样的:我无法从的一些的意见。我得到这个错误:

enter image description here

即使我写一个简单的SQL命令,我得到了同样的错误。

SELECT * FROM "SchemaName"."ViewName" 

但是,如果我转到“列”选项卡,所有列显示正确映射。

我检查了Oracle方面的权限,一切似乎都没问题。我可以在同一个模式中查询其他视图,但其中一些给了我这个错误。你可以看到,我没有指定任何转换,我查询的视图没有日期列。

有没有人明白为什么这个错误出现在特定的视图? 谢谢。

编辑:查询在Oracle中运行良好,所以问题不在视图定义中。

+1

由于服务器和客户端NLS参数之间的不匹配,是否可能将这些日期字段中的一个隐式转换为字符串的格式与预期的格式不同? –

+0

我会进一步研究,但即使我运行如下SQL命令: 'SELECT CODSEC FROM SchemaName.ViewName' 即使CODSEC是整数字段,它也会返回完全相同的错误。 – RodWall

+0

它是一个ORA-01861错误 - 错误可能发生在视图SQL中,而不是ODBC。尝试使用SQL客户端连接到数据库并运行您的select语句以确认您得到相同的错误。如果是这样,那么它在视图定义本身内,并且 - 再次 - 可能是字符串到日期的转换,或者可能是数字转换。 –

回答

1

问题不在您的查询中,也不在权限中。这个错误肯定来自视图本身。问题可能发生在您将数据类型转换为另一数据类型的任何地方,因此请检查TO_NUMBER,TO_DATE甚至TO_CHAR。在其中一种语句中,格式掩码(或要转换的数据)无效。

+0

是的,问题是数据转换。 TO_DATE应该是TO_CHAR。 谢谢。 – RodWall

1

此错误可能发生在视图SQL的执行上,而不是在ODBC中,并且发生在存在一个或多个无效值的转换格式失败的情况下。通常这发生在字符串到最新的转换中。我可以用下面的脚本复制它。

> SQL> create table mytemp(x varchar2(10)); 
> Table created. 
> 
> SQL> create or replace view myview as select to_date(x,'yyyy/mm/dd') 
> xdat from mytemp; 
> View created 
> 
> SQL> insert into mytemp values ('1965/12/12'); 
> 1 row created. 
> 
> SQL> commit; 
> Commit complete. 
> 
> SQL> select * from myview; 
> 
> XDAT  
> --------- 
> 12-DEC-65 

耶,我已经证实,视图是伟大的!

直到....

> 
> SQL> insert into mytemp values ('12121965'); 
> 1 row created. 
> 
> SQL> commit; 
> Commit complete. 
> 
> SQL> select * from myview; 
> 
> select * from myview 
>    * 
> Error at line 1 ORA-01861: literal does not match format string 

所以在视图中的SQL有效,则SQL来选择它是有效的,直到一个数据行进来包含错误的数据这一切的伟大工程。

通过该链接执行SQL的某个地方正在发生类似的情况。可能它是在视图中。也许,如果select是insert的一部分,那么它会在插入端进行格式化。但绝对这是在执行的SQL语句中的某处执行数据转换的问题。

+0

Michael Broughton,你是对的。 Where子句中有一个TO_CHAR类型。当我评论它时,Integration Services立即获得了数据。由于该列是日期类型,因此无法将其转换为CHAR。我把剧组改成了TO_DATE,给了格式和一切工作。 谢谢你对我的问题的所有答案,这真的很有帮助。 – RodWall