当前使用版本(必填,否则不予处理)

MyBatis-Plus 3.1.1 数据库 Microsoft SQL Server 2008

该问题是如何引起的?

子查询使用ROW_NUMBER函数,然后分页就报错了,放在navicat工具中sql是可以执行的 1322328e2c3e53e60269657da0bf78e

原sql语句

SELECT * FROM ( SELECT TOP 100 TC.CUST_ID, TC.CUST_NO, TC.CUST_NAME, TC.BIRTHDAY, TC.CARD_TYPE, TC.CARD_TYPE_NAME, TFO.CARD_ID, TC.AGE, TC.CARD_VALID_DATE, TC.SEX, TC.COUNTRY, TD.TYPE_CONTENT AS COUNTRY_NAME, TC.VOC_TYPE_NAME, TC.MOBILE, TC.E_MAIL, TC.CUST_TYPE, TC.POST_ADDRESS, TC.CUST_SOURCE, TC.CUST_SOURCE_NAME, TC.RECOMMENDED, TC.SERVICE_MAN, PE.LOGIN_USER, TM.MANAGERNAME AS SERVICE_MAN_NAME, TC.STATUS, TC.STATUS_NAME , TC.IMAGEIDENTIFICATION, TFO.IMAGE2, TC.CONTACT_MAN, TC.LEGAL_MAN, TC.LEGAL_ADDRESS, TC.POST_CODE2, TC.MONEY_SOURCE_NAME, TC.HGTZR_BH, ROW_NUMBER ( ) OVER ( PARTITION BY TC.CUST_ID ORDER BY TC.CUST_ID ) AS CUST_COUNT FROM EFCRM..TCUSTOMERS TC LEFT JOIN TOPERATOR PE ON PE.OP_CODE = TC.SERVICE_MAN LEFT JOIN EFCRM..TCUSTCARDINFO TFO ON TC.CUST_ID = TFO.CUST_ID AND TFO.CARD_TYPE = '110801', TDICTPARAM TD, EFCRM..TCUSTMANAGERS TM WHERE TC.SERVICE_MAN = TM.MANAGERID AND TD.TYPE_ID = 9997 AND TD.TYPE_VALUE = TC.COUNTRY ) CUSTDATA

重现步骤(如果有就写完整)

报错信息

org.springframework.jdbc.UncategorizedSQLException:

Error querying database. Cause: java.sql.SQLException: sql injection violation, syntax error: TODO. pos 518, line 13, column 35, token AS :

   WITH selectTemp AS (SELECT TOP 100 PERCENT  ROW_NUMBER() OVER (ORDER BY TC.CUST_ID 
    ) AS CUST_COUNT
    FROM
        EFCRM..TCUSTOMERS TC LEFT JOIN TOPERATOR PE ON PE.OP_CODE = TC.SERVICE_MAN,
        EFCRM..TCUSTMANAGERS TM,EFCRM..TCUSTCARDINFO TFO,
        TDICTPARAM TD

    WHERE
        TC.SERVICE_MAN = TM.MANAGERID
        AND TD.TYPE_ID = 9997
        AND TD.TYPE_VALUE = TC.COUNTRY
        AND TC.CUST_ID = TFO.CUST_ID

        AND TC.CUST_TYPE = ?) as __row_number__,  TC.CUST_ID,
        TC.CUST_NO,
        TC.CUST_NAME,
        TC.BIRTHDAY,
        TC.CARD_TYPE,
        TC.CARD_TYPE_NAME,
        TC.CARD_ID,TC.AGE,
        TC.CARD_VALID_DATE,
        TC.SEX,
        TC.COUNTRY,
        TD.TYPE_CONTENT AS COUNTRY_NAME,
        TC.VOC_TYPE_NAME,
        TC.MOBILE,
        TC.E_MAIL,
        TC.CUST_TYPE,
        TC.POST_ADDRESS,
        TC.CUST_SOURCE,
        TC.CUST_SOURCE_NAME,
        TC.RECOMMENDED,
        TC.SERVICE_MAN,PE.LOGIN_USER,
        TM.MANAGERNAME AS SERVICE_MAN_NAME,
        TC.STATUS,
        TC.STATUS_NAME ,
        TC.IMAGEIDENTIFICATION,TFO.IMAGE2,
        TC.CONTACT_MAN,
        TC.LEGAL_MAN,
        TC.LEGAL_ADDRESS,
        TC.POST_CODE2,
        TC.MONEY_SOURCE_NAME,
        TC.HGTZR_BH,ROW_NUMBER ( ) OVER ( PARTITION BY TC.CUST_ID ORDER BY TC.CUST_ID ) AS CUST_COUNT
    FROM
        EFCRM..TCUSTOMERS TC LEFT JOIN TOPERATOR PE ON PE.OP_CODE = TC.SERVICE_MAN,
        EFCRM..TCUSTMANAGERS TM,EFCRM..TCUSTCARDINFO TFO,
        TDICTPARAM TD

    WHERE
        TC.SERVICE_MAN = TM.MANAGERID
        AND TD.TYPE_ID = 9997
        AND TD.TYPE_VALUE = TC.COUNTRY
        AND TC.CUST_ID = TFO.CUST_ID

        AND TC.CUST_TYPE = ?) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 1 AND 5 ORDER BY __row_number__

这个是后台打印的报错sql语句。我看默认是使用ROW_NUMBER 进行排序,然后再进行分页。但是不知道为什么我子查询里面 ROW_NUMBER,会影响到分页。打印出来的sql也不对。 我目前是想子查询使用ROW_NUMBER,排除掉重复的数据行,但是好像分页不兼容这样。

Comment From: wumingkai007

大佬,求解。我只想想用一下ROW_NUMBER,结果影响到了分页。

Comment From: wumingkai007

数据库版本的原因。数据库使用的是Microsoft SQL Server 2008(分页不兼容)。换了mysql就正常了。