当前使用版本(必填,否则不予处理)
MyBatis-Plus 3.1.1 数据库 Microsoft SQL Server 2008
该问题是如何引起的?
子查询使用ROW_NUMBER函数,然后分页就报错了,放在navicat工具中sql是可以执行的
原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就正常了。