当前位置: 代码迷 >> DB2 >> db2中 SQL语句与 SQLSever中有什么区别解决办法
  详细解决方案

db2中 SQL语句与 SQLSever中有什么区别解决办法

热度:7694   发布时间:2013-02-26 00:00:00.0
db2中 SQL语句与 SQLSever中有什么区别
select   a.*   ,(select   count(*)   from   jacky.ws_sheettreemsg   b   where   a.nodecode=substring(b.nodecode,1,length(a.nodecode))   and     b.moduletype=1   and     length(   replace(replace(replace(b.nodecode, '0000 ', '@ '), '@00 ', ' '), '@ ', ' '))=length(a.nodecode)+2)   as     count   from   (select   replace(replace(replace(nodecode, '0000 ', '@ '), '@00 ', ' '), '@ ', ' ')   as   nodecode,   nodename,sqlfilter,isfilllist,listid   from   jacky.ws_sheettreemsg   where   moduletype=1)   as   a   where     length(replace(replace(replace(nodecode, '0000 ', '@ '), '@00 ', ' '), '@ ', ' '))=2       order   by   nodecode  


上述SQL语句在SQLSever下能通过,在DB2下就报错:

SQL0440N     未找到类型为   "FUNCTION "   命名为   "SUBSTRING "
且具有兼容自变量的已授权例程。     SQLSTATE=42884

解释:  

当数据库管理器找不到可用来实现引用的例程时,若引用例程
" <例程名> ",则会发生此错误。引起此错误的原因有下列几个:  

o       " <例程名> "   未正确指定或者在数据库中不存在。  

o       进行了限定引用,但不正确地指定了限定符。  

o       用户的   SQL
        路径不包含期望的函数或方法所属的模式,且使用了一个非限定引用。  

o       包括了错误的自变量数。  

o       函数或方法引用中包括正确数目的自变量,但是一个或多个自变量的数
        据类型不正确。  

o       例程不存在于具有在绑定程序包时使用的相同函数标识的数据库中(适
        用于静态语句)。  

o       找不到与   UPDATE   语句中所使用的属性赋值相对应的更换方法。
        该属性的新值的数据类型与该属性的数据类型不同,或者不是可提升为
        该属   性的数据类型的数据类型。  

o       例程调用者无权执行该例程。  

请问改如何解决

------解决方案--------------------------------------------------------
在db2里面叫substr
具体使用发放参见信息中心中的sqlreference
PS:这个SQL的执行效率真是。。。。。
------解决方案--------------------------------------------------------
length(replace(replace(replace(nodecode, '0000 ', '@ '), '@00 ', ' '), '@ ', ' '))=2

这个挺有趣的,琢磨了一下,
这个是不是找符合:?000000?,或者 ??000000,000000?? 的情况?
? 还不能等于0 .

好像没法优化,用了这个函数后 不会去使用索引了,但是 要是 like '?000000? '
的话,也不会使用所以了哦。。
  相关解决方案