无法将 ORDER BY 命令添加到存储过程

Posted

技术标签:

【中文标题】无法将 ORDER BY 命令添加到存储过程【英文标题】:Cannot add an ORDER BY command to a stored procedure 【发布时间】:2011-05-16 11:20:46 【问题描述】:

我正在将我正在维护的一些软件中的存储过程从SQL Server SQL转换为Informix SQL,问题很多。

基本上我会逐行转换每个部分,直到全部转换完毕。

我有以下CREATE PROCEDURE

CREATE PROCEDURE ifxdbase:dc_buildSP (WorkID INT, CompNo smallint)
CREATE TEMP TABLE Items
(
   Code smallint,
   Qty int,
   Total int
);

INSERT INTO Items
SELECT 
   tblDetails.code, 
   tblDetails.quantity,
   tblHead.quantity
FROM
   tblHead
INNER JOIN tblDetails ON (tblDetails.compno = tblDetails.compno AND tblDetails.id_num = tblHead.id_num)
WHERE tblHead.compno = CompNo AND tblHead.id_num = WorkID;
--ORDER BY tblDetails.code;

DROP TABLE Items;
END PROCEDURE

就目前而言,这可以正常工作,但是当我取消注释 --ORDER BY tblDetails.seqno; 行(并从上一行中删除分号)时,我收到“-201 A syntax error has occurred”错误。

基本上tblHead 是一系列订单标题,tblDetails 是每个订单详细信息的表格。选择和加入数据工作正常,尝试排序失败。

排序应该适用于原始 SELECT、IIRC 中的任何内容,所以我看不出有什么问题,在这里...

【问题讨论】:

往表中插入数据为什么需要order by? 问题不是存储过程,问题是在 INSERT INTO ....SELECT 构造中不允许使用 ORDER BY 子句 【参考方案1】:

如here所述:

..... 不是所有的子句和选项 SELECT 语句可用于 您在查询中使用 插入语句。以下选择 不支持子句和选项 通过 Informix 在 INSERT 语句中:

FIRST 和 INTO TEMP

ORDER BY 和 UNION

所以在 Informix 的 INSERT 命令中不支持 ORDER BY。

我现在没有要测试的东西,但您可以尝试这样的解决方法:

INSERT INTO Items
SELECT code, dQuantity, hQuantity
  FROM (
    SELECT 
     tblDetails.code, 
     tblDetails.quantity dQuantity,
     tblHead.quantity hQuantity
    FROM
     tblHead
    INNER JOIN tblDetails ON (tblDetails.compno = tblDetails.compno AND tblDetails.id_num = tblHead.id_num)
    WHERE tblHead.compno = CompNo AND tblHead.id_num = WorkID;
    ORDER BY tblDetails.code
  );

【讨论】:

好的,很公平。它适用于 SQL Server。正如上面 Lieven 所提到的,无论如何都没有真正的充分理由存在 ORDER BY。感谢您提供文档参考和解决方法建议。

以上是关于无法将 ORDER BY 命令添加到存储过程的主要内容,如果未能解决你的问题,请参考以下文章

SQL 分页查询存储过程中order by 后面不能传变量的问题怎么解决

从存储过程中的视图中选择时不能使用 ORDER BY

MySQL 存储过程 SELECT、三个 WHERE CLAUSE 值和 ORDER BY

存储过程 - 在 ORDER BY 列表位置 2 中遇到常量表达式

取第N个排序的元素之Mysql存储过程动态SQL order by offset实现案例

将 ORDER BY 语句添加到查询而不展平结果会导致“无法查询重复字段的叉积”