【问题标题】:Error unexpected token in stored procedure Advantage Database SQL存储过程 Advantage Database SQL 中出现错误的意外令牌
【发布时间】:2018-05-23 21:07:55
【问题描述】:

我有一个存储过程,它给了我一个意外的令牌;当我尝试执行此语句时,ORDER 期待分号。

从 #temp 中选择年份,其中年份不为空 ORDER BY year DESC;

如果我删除 ORDER BY year DESC; 程序正常运行。

我已经尝试了所有可能的方法来按降序对结果表进行排序。我对 SQL 相当陌生,所以我确信它很简单。 TIA。

// --------- 完整的存储过程 ------ //

ALTER PROCEDURE GetYearForExhaustCatalog
   ( 
      CatCodeString Memo,
      Year CHAR ( 4 ) OUTPUT
   ) 
BEGIN 
/*

  EXECUTE PROCEDURE GetYearForExhaustCatalog('(e.catalogcode= ''2182'')');

  EXECUTE PROCEDURE GetYearForExhaustCatalog('');


*/  

DECLARE @CatCodeString string;
DECLARE @SQL string;

@CatCodeString = (SELECT CatCodeString FROM __input);

if @CatCodeString IS NULL or @CatCodeString = '' then
  select e2.year,
  (SELECT top 1 e2.year
  FROM  eenginecatalog e LEFT JOIN exhaustengine e2 ON e2.app_no=e.app_no)
  as year
  into #temp
  from Exhaustengine e2;
  select year from #temp where year is not null
  GROUP BY  year
  ORDER BY  year DESC;
else
  @SQL = 
    'select e2.year, '+ 
    '(SELECT top 1 e2.year '+
    'FROM  eenginecatalog e LEFT JOIN exhaustengine e2 ON e2.app_no=e.app_no and '+
       @CatCodeString +' ) '+ 
    'as year '+
    'into #temp '+
    'from Exhaustengine e2; '+
    'select year from #temp where year is not null '+
    'GROUP BY  year '+
    'ORDER BY  year DESC ';
  execute immediate @SQL;
end;

insert into __output
  select year from #temp where year is not null ORDER BY year;
  drop table #temp;

END;

【问题讨论】:

    标签: sql stored-procedures advantage-database-server


    【解决方案1】:

    在插入特殊的__output 表时,ADS 似乎不喜欢ORDER BY 子句。

    这也不行:

    CREATE PROCEDURE MyProcedure(Year INTEGER OUTPUT) 
    BEGIN 
    
    CREATE TABLE #tmp ("Year" INTEGER);
    
    INSERT INTO #tmp ("Year") VALUES (2019);
    INSERT INTO #tmp ("Year") VALUES (2017);
    INSERT INTO #tmp ("Year") VALUES (2018);
    
    INSERT INTO
      __output
    SELECT
      "Year"
    FROM #tmp
    ORDER BY
      "Year";
    
    DROP TABLE #tmp;
    
    END;
    

    它失败并显示您收到的相同错误消息:

    poQuery: Error 7200:  AQE Error:  State = 42000;   NativeError = 2117;  [SAP][Advantage SQL Engine]Unexpected token: ORDER -- Expecting semicolon. -- Location of error in the SQL statement is: 269 (line: 15 column: 1)
    

    作为一种解决方法,您可以创建另一个对结果进行排序的临时表:

    CREATE PROCEDURE MyProcedure(Year INTEGER OUTPUT) 
    BEGIN 
    
    CREATE TABLE #tmp ("Year" INTEGER);
    
    INSERT INTO #tmp ("Year") VALUES (2019);
    INSERT INTO #tmp ("Year") VALUES (2017);
    INSERT INTO #tmp ("Year") VALUES (2018);
    
    SELECT
      *
    INTO #sorted
    FROM #tmp
    ORDER BY
      "Year"
    ;
    
    INSERT INTO
      __output
    SELECT
      "Year"
    FROM #sorted;
    
    DROP TABLE #sorted;
    DROP TABLE #tmp;
    
    END;
    

    这可以正常工作,并且数据已排序。

    【讨论】:

      【解决方案2】:

      __output 表不是罪魁祸首。在 SQL 标准中,一般不允许在子查询中使用 ORDER BY。原因是在查询的内部解析期间对一组行进行排序应该没有影响。它只对最终结果有用。在纯 SQL 意义上,唯一保证结果排序的操作是对最终结果的 ORDER BY。

      如果你遵循这个逻辑,可能的替代方法是不尝试将数据按排序顺序放入 __output 表中,而是使最终输出按以下顺序排序:

      SELECT * FROM (EXECUTE PROCEDURE MyProcedure(inParam)) t ORDER BY t.year
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-20
        相关资源
        最近更新 更多