首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > IBM DB2 >

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

2012-03-24 
db2中 SQL语句与 SQLSever中有什么区别selecta.*,(selectcount(*)fromjacky.ws_sheettreemsgbwherea.nodec

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? '
的话,也不会使用所以了哦。。

热点排行