带有“partition by”的准备语句对Sybase IQ不起作用?

时间:2009-07-06 16:45:51

标签: c++ sql sybase-asa

使用预准备语句查询Sybase IQ时遇到问题。当我将整个查询作为文本键入然后在没有参数的情况下调用PrepareStatement时,查询工作正常。但是当我坚持一个参数时,即使我的sql是正确的,我也会收到错误。知道为什么吗?

此代码完全正常并运行我的查询:

errorquery<<"SELECT   1   as foobar \
        ,       (SUM(1) over (partition by foobar) )      as myColumn  \
        FROM spgxCube.LPCache lpcache   \
                WHERE    lpcache.CIG_OrigYear = 2001    "; 


odbc::Connection* connQuery= SpgxDBConnectionPool::getInstance().getConnection("MyServer");
PreparedStatementPtr pPrepStatement(connQuery->prepareStatement(errorquery.str()));
    pPrepStatement->executeQuery();

但这是完全相同的事情,除了不在代码中直接输入“2001”,我插入一个参数:

    errorquery<<"SELECT   1   as foobar \
        ,       (SUM(1) over (partition by foobar) )      as myColumn  \
        FROM spgxCube.LPCache lpcache   \
                WHERE    lpcache.CIG_OrigYear = ?    "; 

    odbc::Connection* connQuery = SpgxDBConnectionPool::getInstance().getConnection("MyServer");
    PreparedStatementPtr pPrepStatement(connQuery->prepareStatement(errorquery.str()));

    int intVal = 2001;
    pPrepStatement->setInt(1, intVal);

    pPrepStatement->executeQuery();

产生此错误:  [Sybase] [ODBC驱动程序] [Adaptive Server Anywhere]'(SUM(1)over(foobar分区)附近的表达式为myColumn'

如果第二个失败,任何想法为什么第一个有效?您是否不允许使用插入的sql参数或类似的东西使用“partition by”?

2 个答案:

答案 0 :(得分:1)

Sybase(ASA)Adaptive Server Anywhere错误很好,IQ DB中包含一个Sybase ASA实例,用于SYSTEM空间。

我不知道Sybase IQ v12.7之前的版本是否支持/完全支持partition by。我记得在v12.6下遇到了问题。在v12.7或更好的情况下它应该没问题,否则你的命令看起来对我很好。

答案 1 :(得分:0)

我对Adaptive Server Anywhere知之甚少,但您使用的是Adaptive Server Anywhere驱动程序来查询Sybase IQ。

这真的是你想要的吗?