sql - 存储过程 Advantage Database SQL 中出现错误的意外令牌
问题描述
我有一个存储过程,它给了我一个意外的令牌;当我尝试执行此语句时,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;
解决方案
ORDER BY
插入特殊__output
表时,似乎 ADS 不喜欢该子句。
这也不起作用:
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;
这可以正常工作,并且数据已排序。
推荐阅读
- javascript - 如何在 pre 标签内右对齐内部元素
- javascript - 如何在 reactjs 版本 16.13.1 中获取输入文本的值
- ruby - 安装最新版本后显示的旧 Ruby 版本 | rbenv 和 zsh
- apache-flink - Flink:多数据中心部署可能吗?
- php - Laravel: 403 此操作未经授权
- prolog - 三个 Prolog 问题包括祖父母
- java - 删除 Java 列表中的双重对象
- javascript - JS Promises:为什么 await 必须在异步函数中?
- polling - 在 Azure API 管理请求中轮询持久函数
- javascript - 为什么即使使用钩子更新父状态,子组件也不重新渲染