Abap SAP HANA CX\u AMDP\u执行\u失败转储SQL代码339日期SQL

Abap SAP HANA CX\u AMDP\u执行\u失败转储SQL代码339日期SQL,abap,hana,hana-sql-script,amdp,Abap,Hana,Hana Sql Script,Amdp,我在AMDP类中有一个sqlscript。我对以下陈述感到不满: sel1 = select mandt, equnr, ROW_NUMBER() OVER ( PARTITION BY equnr ORDER BY equnr, idate, itime, mdocm) as rnum, to_date(idate) as idate, cast(to_varchar(idate) || to_varchar(itime) as "$ABAP.type( TS

我在AMDP类中有一个sqlscript。我对以下陈述感到不满:

sel1 = select mandt, equnr,
    ROW_NUMBER() OVER ( PARTITION BY equnr ORDER BY equnr, idate, itime, mdocm) as rnum,
    to_date(idate) as idate,
    cast(to_varchar(idate) || to_varchar(itime) as "$ABAP.type( TSTMP_BW_EXTRACT )" ) AS mytimestmp,
    LEAD(cast(to_varchar(idate) || to_varchar(itime) as "$ABAP.type( TSTMP_BW_EXTRACT )" )) OVER ( ORDER 
       BY equnr, idate, itime, MDOCM) timdelta,
    to_decimal('0.0',25,6) as mydiff,
    VLCOD,
    LEAD(vlcod, 1) OVER ( ORDER BY equnr,idate,itime,MDOCM) as nxtVlcod,    
    TO_DECIMAL('0.0',25,6) as T_PRESS_RUN,    
    TO_DECIMAL('0.0',25,6) as T_PRESS_DWN,    
    TO_DECIMAL('0.0',25,6) as T_UPRESS_DWN    
    from :sel_imrg    
     where equnr = :v_equnr    
       and idate between v_date_begin and v_date_end    
     order by mandt, equnr, idate, itime, MDOCM;
问题似乎在于将单独的idate和itime字段转换为时间戳。我尝试了许多不同的数据类型来获取时间戳值,如上面所示的时间戳和ABAP类型。我还尝试了将timestamp()、cast()转换为decimal()等

奇怪的是,几乎完全相同的语句在HANA studio SQL控制台的HANA侧车中工作得很好

转储文件显示CX_AMDP_执行失败SQL错误339 [339](范围3)无效数字异常:无效数字:“TST”“SAPTST”“ZCL#U测试#U类=>执行#stb2#20210405110801”:| |l“

系统为HANA 2.00.048.00.1591276203上的S/4 1809 SAP_ABA 75D SP5

非常感谢大家提供的帮助。

错误消息“[339](范围3)无效数字异常:无效数字指字符串转换为数字数据类型失败

这意味着,这不是关于将数字或字符串转换为日期或时间戳数据类型的

隐含转换的潜在原因是WHERE子句的这一部分:

where equnr = :v_equnr  
如果
:v_eqnr
是数字数据类型,但列
eqnr
是字符数据类型,则需要执行隐式类型转换,即字符串
eqnr
将类型转换为数字数据类型。当列
eqnr
完全包含字符时,这将产生OP遇到的错误


因此,这不仅取决于语句和表结构,还取决于表中的实际数据,这可能是同一语句在另一个系统上工作的原因。

SAP支持帮助我解决了这个问题

尽管SAP支持部门没有特别提及,但hana sql脚本(或未记录的功能,取决于您如何看待它)中似乎存在缺陷

如果试图从单独的日期和时间值形成时间戳值,则必须将日期和时间与“YYYY-MM-DD HH24:MI:SS”之间的空格连接起来。但是,不能仅将“”用作空格。必须将ascii表示形式用于空格:char(32)。

正如我前面提到的。该代码的原始版本在HANA studio的匿名块中工作得很好。只有在AMDP中它才会转储

此代码在AMDP内成功执行,无转储:

sel1 = select mandt,
   EQUNR,
   ROW_NUMBER() OVER ( PARTITION BY equnr ORDER BY equnr, idate, itime, MDOCM) as rnum,
   to_date(idate) as idate,
   ifnull(to_timestamp( idate || char(32) || itime, 'YYYY-MM-DD HH24:MI:SS'), '0001-01-01 00:00:00') AS mytimestmp,
   ifnull(LEAD(to_timestamp( idate || char(32) || itime, 'YYYY-MM-DD HH24:MI:SS')) OVER ( ORDER BY equnr, idate, itime, MDOCM), '0001-01-01 00:00:00') timdelta,
   to_decimal('0.0',25,6) as mydiff,
   VLCOD,
   LEAD(vlcod, 1) OVER ( ORDER BY equnr,idate,itime,MDOCM) as nxtVlcod,
   TO_DECIMAL('0.0',25,6) as T_PRESS_RUN,
   TO_DECIMAL('0.0',25,6) as T_PRESS_DWN,
   TO_DECIMAL('0.0',25,6) as T_UPRESS_DWN
    from :sel_imrg
     where equnr = :v_equnr
       and idate between v_date_begin and v_date_end
     order by mandt, equnr, idate, itime, MDOCM;

您需要检查indexserver跟踪并在此处找到错误文本。这将为您提供转换失败的确切值。通常,您应该注意空字符串:例如,HANA不知道如何将它们转换为十进制,因此您需要使用
转换为十进制(nullif(inp,,))
Lars,如果在查询中离开:v_eqnr,我只需将“cast(to_varchar(idate)…”和“LEAD(cast)(to_varchar(idate)…”替换为“null as mytimestamp”和“null as timdelta”“查询工作没有任何问题。此外,此查询在HANA sidecar中作为匿名块使用S/4表的虚拟表运行良好。从技术上讲,sidecar是不同的系统,但数据是相同的。HANA工作非常有趣,没什么可说的;)我见过很多通过不同工具执行相同表达式的案例。