当前使用版本(使用版本是3.1.2)
该问题是怎么引起的?
IPage分页,会在原先的sql语句外面,嵌套一个with as语句。如果原先写的sql语句里面有with as,双重嵌套直接报错了。我写了sql语句是没错了,验证过了,去掉分页就可以,加上分页,就报了这个with as 嵌套错误。
重现步骤
报错信息
SQL: WITH selectTemp AS (SELECT TOP 100 PERCENT ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as row_number, WITH CUST_TABLE AS ( SELECT TC.CUST_ID FROM EFCRM..TCUSTOMERS TC, TBENIFITOR TB, TPRODUCT TP WHERE TP.PRODUCT_ID = TB.PRODUCT_ID AND TB.CUST_ID = TC.CUST_ID GROUP BY TC.CUST_ID ) SELECT TC.CUST_ID, TC.CUST_NO, TC.CUST_NAME, TC.BIRTHDAY, TC.CARD_TYPE, TC.CARD_TYPE_NAME, TC.CARD_ID, 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, TM.MANAGERNAME AS SERVICE_MAN_NAME, TC.STATUS, TC.STATUS_NAME , TC.IMAGEIDENTIFICATION, TC.CONTACT_MAN, TC.LEGAL_MAN, TC.LEGAL_ADDRESS FROM EFCRM..TCUSTOMERS TC, CUST_TABLE CU, EFCRM..TCUSTMANAGERS TM, TDICTPARAM TD WHERE TC.SERVICE_MAN = TM.MANAGERID AND TD.TYPE_ID = 9997 AND TD.TYPE_VALUE = TC.COUNTRY AND TC.CUST_ID = CU.CUST_ID) SELECT * FROM selectTemp WHERE row_number BETWEEN 1 AND 2 ORDER BY row_number
Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'ABLE AS (
SELECT
', expect RPAREN, actual AS pos 128, line 1, column 126, token AS : WITH selectTemp AS (SELECT TOP 100 PERCENT ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __row_number__, WITH CUST_TABLE AS (
SELECT
TC.CUST_ID
FROM
EFCRM..TCUSTOMERS TC,
TBENIFITOR TB,
TPRODUCT TP
WHERE
TP.PRODUCT_ID = TB.PRODUCT_ID
AND TB.CUST_ID = TC.CUST_ID
GROUP BY
TC.CUST_ID
) SELECT TC.CUST_ID,
TC.CUST_NO,
TC.CUST_NAME,
TC.BIRTHDAY,
TC.CARD_TYPE,
TC.CARD_TYPE_NAME,
TC.CARD_ID,
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,
TM.MANAGERNAME AS SERVICE_MAN_NAME,
TC.STATUS,
TC.STATUS_NAME ,
TC.IMAGEIDENTIFICATION,
TC.CONTACT_MAN,
TC.LEGAL_MAN,
TC.LEGAL_ADDRESS
FROM
EFCRM..TCUSTOMERS TC,
CUST_TABLE CU,
EFCRM..TCUSTMANAGERS TM,
TDICTPARAM TD
WHERE
TC.SERVICE_MAN = TM.MANAGERID
AND TD.TYPE_ID = 9997
AND TD.TYPE_VALUE = TC.COUNTRY
AND TC.CUST_ID = CU.CUST_ID) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 1 AND 2 ORDER BY __row_number__
; uncategorized SQLException; SQL state [null]; error code [0]; sql injection violation, syntax error: syntax error, error in :'ABLE AS ( SELECT ', expect RPAREN, actual AS pos 128, line 1, column 126, token AS : WITH selectTemp AS (SELECT TOP 100 PERCENT ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as row_number, WITH CUST_TABLE AS ( SELECT TC.CUST_ID FROM EFCRM..TCUSTOMERS TC, TBENIFITOR TB, TPRODUCT TP WHERE TP.PRODUCT_ID = TB.PRODUCT_ID
AND TB.CUST_ID = TC.CUST_ID
GROUP BY
TC.CUST_ID
) SELECT TC.CUST_ID,
TC.CUST_NO,
TC.CUST_NAME,
TC.BIRTHDAY,
TC.CARD_TYPE,
TC.CARD_TYPE_NAME,
TC.CARD_ID,
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,
TM.MANAGERNAME AS SERVICE_MAN_NAME,
TC.STATUS,
TC.STATUS_NAME ,
TC.IMAGEIDENTIFICATION,
TC.CONTACT_MAN,
TC.LEGAL_MAN,
TC.LEGAL_ADDRESS
FROM
EFCRM..TCUSTOMERS TC,
CUST_TABLE CU,
EFCRM..TCUSTMANAGERS TM,
TDICTPARAM TD
WHERE
TC.SERVICE_MAN = TM.MANAGERID
AND TD.TYPE_ID = 9997
AND TD.TYPE_VALUE = TC.COUNTRY
AND TC.CUST_ID = CU.CUST_ID) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 1 AND 2 ORDER BY __row_number__; nested exception is java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'ABLE AS (
SELECT
', expect RPAREN, actual AS pos 128, line 1, column 126, token AS : WITH selectTemp AS (SELECT TOP 100 PERCENT ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __row_number__, WITH CUST_TABLE AS (
SELECT
TC.CUST_ID
FROM
EFCRM..TCUSTOMERS TC,
TBENIFITOR TB,
TPRODUCT TP
WHERE
TP.PRODUCT_ID = TB.PRODUCT_ID
AND TB.CUST_ID = TC.CUST_ID
GROUP BY
TC.CUST_ID
) SELECT TC.CUST_ID,
TC.CUST_NO,
TC.CUST_NAME,
TC.BIRTHDAY,
TC.CARD_TYPE,
TC.CARD_TYPE_NAME,
TC.CARD_ID,
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,
TM.MANAGERNAME AS SERVICE_MAN_NAME,
TC.STATUS,
TC.STATUS_NAME ,
TC.IMAGEIDENTIFICATION,
TC.CONTACT_MAN,
TC.LEGAL_MAN,
TC.LEGAL_ADDRESS
FROM
EFCRM..TCUSTOMERS TC,
CUST_TABLE CU,
EFCRM..TCUSTMANAGERS TM,
TDICTPARAM TD
WHERE
TC.SERVICE_MAN = TM.MANAGERID
AND TD.TYPE_ID = 9997
AND TD.TYPE_VALUE = TC.COUNTRY
AND TC.CUST_ID = CU.CUST_ID) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 1 AND 2 ORDER BY __row_number__