SQL serve查询uniqueidentifier转换及异常问题

1,267 阅读1分钟

错误一:sql server将字符串转换为 uniqueidentifier 时失败

修改前:

SELECT
	a.OVER_QUOTA_APPLYOID AS applyId,
	al.OVER_QUOTA_APPROVALOID AS approvalId,
	b.PartnerName AS clientName,
	b.PartnerID AS clientId,
	f.Docno AS fsno,
	b.LevelID AS clientLevel,
	u.EmployeeName AS businessPerson,
	a.Advance_AMOUNT AS advanceAmount,
	a.Tax_AMOUNT AS taxAmount,
	a.SYS_Created AS applyTime,
	a.APPLY_STATUS AS applyStatus 
FROM
	FINB001 f
	LEFT JOIN BASB001 b ON f.BASB001_FK = b.BASB001OID
	LEFT JOIN UCML_User u ON u.UCML_UserOID = b.BusinessID
	LEFT JOIN OVER_QUOTA_APPLY a ON f.FINB001OID = a.FH_AP_FK
	LEFT JOIN OVER_QUOTA_APPROVAL al ON a.OVER_QUOTA_APPLYOID = al.OVER_QUOTA_APPLY_FK 
WHERE
	ORDER_TYPE = 1 
	AND FINB001OID = ( SELECT FH_AP_FK FROM OVER_QUOTA_APPLY WHERE OVER_QUOTA_APPLYOID = ? )

修改后:

SELECT
	a.OVER_QUOTA_APPLYOID AS applyId,
	al.OVER_QUOTA_APPROVALOID AS approvalId,
	b.PartnerName AS clientName,
	b.PartnerID AS clientId,
	f.Docno AS fsno,
	b.LevelID AS clientLevel,
	u.EmployeeName AS businessPerson,
	a.Advance_AMOUNT AS advanceAmount,
	a.Tax_AMOUNT AS taxAmount,
	a.SYS_Created AS applyTime,
	a.APPLY_STATUS AS applyStatus 
FROM
	FINB001 f
	LEFT JOIN BASB001 b ON f.BASB001_FK = b.BASB001OID
	LEFT JOIN UCML_User u ON u.UCML_UserOID = b.BusinessID
	LEFT JOIN OVER_QUOTA_APPLY a ON f.FINB001OID = a.FH_AP_FK
	LEFT JOIN OVER_QUOTA_APPROVAL al ON a.OVER_QUOTA_APPLYOID = al.OVER_QUOTA_APPLY_FK 
WHERE
	ORDER_TYPE = 1 
	AND FINB001OID = ( SELECT FH_AP_FK FROM OVER_QUOTA_APPLY WHERE CAST(OVER_QUOTA_APPLYOID AS VARCHAR(36)) = ? )

因为OVER_QUOTA_APPLYOID在数据库中的数据类型为uniqueidentifier,如果在使用查询语句传参不为uniqueidentifier形式,就会报字符串转换失败错误。

解决方案:在条件判断之前,把该字段转换为字符串形式即可

错误二:# Incorrect result size: expected 1, actual 0

在使用JDBC的过程中,使用到了queryForObject方法,预期是存在对象,然而查出来为空时,就会抛出DataAccessException异常。

try {
    return sqlserverJdbcTemplate.queryForObject(sql,new Object[]{applyId,applyId},new BeanPropertyRowMapper<>(OverQuotaItem.class));
} catch (DataAccessException e) {
    return null;
}

解决方案:捕获异常,并返回null,即可在查出结果为空时,返回空