{"record":{"id":"2f030be9bf24d6ea","repo":"pagehelper-org/Mybatis-PageHelper","slug":"the-sql-statement-cannot-be-converted-to-a-paginat","errorCode":null,"errorMessage":"The SQL statement cannot be converted to a pagination query!","messagePattern":"The SQL statement cannot be converted to a pagination query!","errorType":"exception","errorClass":"PageException","httpStatus":null,"severity":"error","filePath":"src/main/java/com/github/pagehelper/parser/defaults/DefaultSqlServerSqlParser.java","lineNumber":107,"sourceCode":"    public String convertToPageSql(String sql) {\n        return convertToPageSql(sql, null, null);\n    }\n\n    /**\n     * 转换为分页语句\n     *\n     * @param sql\n     * @param offset\n     * @param limit\n     * @return\n     */\n    public String convertToPageSql(String sql, Integer offset, Integer limit) {\n        //解析SQL\n        Statement stmt;\n        try {\n            stmt = SqlParserUtil.parse(sql);\n        } catch (Throwable e) {\n            throw new PageException(\"The SQL statement cannot be converted to a pagination query!\", e);\n        }\n        if (!(stmt instanceof Select)) {\n            throw new PageException(\"the pagination statement must be a select query!\");\n        }\n        //获取分页查询的select\n        Select pageSelect = getPageSelect((Select) stmt);\n        String pageSql = pageSelect.toString();\n        //缓存移到外面了，所以不替换参数\n        if (offset != null) {\n            pageSql = pageSql.replace(START_ROW, String.valueOf(offset));\n        }\n        if (limit != null) {\n            pageSql = pageSql.replace(PAGE_SIZE, String.valueOf(limit));\n        }\n        return pageSql;\n    }\n\n    /**","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/pagehelper-org/Mybatis-PageHelper/blob/c692616c5bc95b41aa779b502f991825c8e5acbc/src/main/java/com/github/pagehelper/parser/defaults/DefaultSqlServerSqlParser.java#L89-L125","documentation":"Thrown by the SQL Server pagination parser when the SQL cannot be parsed by the underlying SQL parser (JSqlParser). The parse failure is wrapped in a PageException indicating the statement cannot be turned into a SQL Server pagination query.","triggerScenarios":"Calling PageHelper pagination with helperDialect=sqlserver (2005 style ROW_NUMBER) on SQL that JSqlParser cannot parse: non-standard syntax, multi-statement strings, DBMS-specific extensions, or syntax errors in the SQL.","commonSituations":"SQL Server dialect used against SQL with vendor-specific syntax JSqlParser does not support; malformed SQL built by string concatenation; XML mapper SQL that contains parser-unfriendly constructs (e.g.某些 hints or WITH clauses in old parser versions).","solutions":["Fix or simplify the SQL so it parses as standard SELECT syntax","Upgrade pagehelper/jsqlparser to a version supporting the SQL syntax used","Switch to a pagination mode that does not require SQL rewriting (e.g. sqlserver2012 dialect or count-based Wrapping via other dialects)","Validate the SQL parses with JSqlParser locally before passing it through"],"exampleFix":"// before\nPageHelper.startPage(1, 10).setDialect(\"sqlserver\");\nString sql = \"SELECT * FROM t WITH (NOLOCK)\"; // unsupported by old parser\n// after\nhelperDialect=sqlserver2012  // or upgrade jsqlparser\nString sql = \"SELECT * FROM t\";","handlingStrategy":"validation","validationCode":"try { JSqlParserUtil.parse(sql); } catch (JSQLParserException e) {\n    throw new IllegalArgumentException(\"SQL not parseable for sqlserver pagination: \" + e.getMessage());\n}","typeGuard":null,"tryCatchPattern":"try { PageHelper.startPage(1, 10); mapper.select(); } catch (PageException e) {\n    log.error(\"SQL Server pagination conversion failed\", e);\n}","preventionTips":["Keep pagination SQL as standard SELECT syntax","Test mapper SQL with the same JSqlParser version PageHelper uses","Upgrade pagehelper/jsqlparser when using exotic syntax","Consider sqlserver2012 dialect (OFFSET/FETCH) which parses more reliably"],"tags":["java","pagehelper","sql-parsing","sqlserver"],"backgroundTag":"sql-query-failed","analyzedSha":"c692616c5bc95b41aa779b502f991825c8e5acbc","analyzedAt":"2026-09-08T03:50:49.192Z","contentChangedAt":"2026-09-08T03:50:49.192Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}