2012-12-13 1 views
0

응용 프로그램에서 SQL 맵을 실행하려고하면 유효하지 않은 열 이름이 나타납니다. 기본적으로 나는 두개의 분리 된 매핑 파일을 가지고있다. 기본적으로 다른 이름을 가진 컬럼을 만드는 것을 제외하고는 같은 일을한다. 이 문제를 설명하기 위해 DROP TABLE을 목적 밖으로 쫓아 버렸습니다. 나는 이것이 나쁜 습관이라는 것을 알고 있지만 이것이 왜 일어나는지를 찾고있다. 이후 모든 SQL 맵에서 테이블을 명시 적으로 삭제하여이 동작을 수정했습니다.iBatis가 임시 테이블이있는 columnName을 유효하지 않습니다.

에 Query1 :

<select id="Query1" parameterClass="query1Criteria"> 

    IF Object_Id('tempdb..##severity') IS NOT NULL  
    BEGIN 
     DROP TABLE ##severity 
    END  

    CREATE TABLE ##severity(valueCode VARCHAR(255) NOT NULL, displayOrder INT NOT NULL) 
    INSERT INTO ##severity 
     SELECT DISTINCT valueCode,MAX(displayOrder) FROM DataDictionaryValue 
     WHERE zoneID = #zoneID# AND categoryCode = 'SEVERITY' 
     GROUP BY valueCode 

    SELECT valueCode FROM ##severity 

</select> 

질의 2 :

<select id="Query2" parameterClass="query2Criteria"> 

    IF Object_Id('tempdb..##severity') IS NOT NULL  
    BEGIN 
     DROP TABLE ##severity 
    END  

    CREATE TABLE ##severity(severityCode VARCHAR(255) NOT NULL, displayOrder INT NOT NULL) 
    INSERT INTO ##severity 
     SELECT DISTINCT valueCode,MAX(displayOrder) FROM DataDictionaryValue 
     WHERE zoneID = #zoneID# AND categoryCode = 'SEVERITY' 
     GROUP BY valueCode 

    SELECT severityCode FROM ##severity 

</select> 

응용 프로그램에서, 나는 Query1을 실행합니다. 잘 실행되고 SQL Management Studio에서 임시 테이블이 생성 된 것을 볼 수 있습니다. 그럼 난 QUERY2을 실행하고 다음 스택 추적 얻을 : 나는 SMS에서 QUERY2의 SQL을 실행하면

org.springframework.jdbc.BadSqlGrammarException: SqlMapClient operation; bad SQL grammar []; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException: 
--- The error occurred in com/test/model/safety/reports/Query2Map.xml. 
--- The error occurred while applying a parameter map. 
--- Check the Query2.getResults-InlineParameterMap. 
--- Check the statement (query failed). 
--- Cause: java.sql.SQLException: Invalid column name 'severityCode'. 
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:276) 
    at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:212) 
    at org.springframework.orm.ibatis.SqlMapClientTemplate.executeWithListResult(SqlMapClientTemplate.java:249) 
    at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForList(SqlMapClientTemplate.java:296) 
    at com.test.model.BaseSqlMapDao.executeQueryForList(BaseSqlMapDao.java:53) 
    at com.test.model.safety.reports.Query2SqlMapDao.getOpenIssues(Query2SqlMapDao.java:124) 
    at com.test.model.safety.reports.Query2SqlMapDao.getResults(Query2SqlMapDao.java:50) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 

, 그것은 제대로 실행됩니다. 사실이 두 가지 쿼리는 모두 SMS에서 올바르게 실행됩니다. iBatis가 어떻게 작동하는지 이해할 수 없지만, iBatis는 Query1에서 생성 된 임시 테이블을보고 해당 스키마에 대해 Query2의 구문을 유효하게합니다.이 경우 잘못된 열 이름 예외가 발생합니다. 그러나 이것은 iBatis가 임시 테이블에 대한 참조를 유지하고 있음을 의미합니다. 임시 테이블은 연결에 적용되는 SQL 서버 패러다임과 모순됩니다.

아무도 무슨 일이 일어나고 있는지 설명 할 수 있습니까?

답변

0

아마도 임시 테이블 대신 테이블 변수를 사용할 수 있습니다.

DECLARE @severity as TABLE (valueCode VARCHAR(255) NOT NULL, displayOrder INT NOT NULL) 

INSERT INTO @severity 
    SELECT DISTINCT valueCode,MAX(displayOrder) FROM DataDictionaryValue 
    WHERE zoneID = #zoneID# AND categoryCode = 'SEVERITY' 
    GROUP BY valueCode 

SELECT valueCode FROM @severity 

은 또한 당신이 DISTINCT 키워드를 삭제할 수 있습니다 :처럼 것

보인다. GROUP BY valueCode은 확실한 valueCode 값을 보장합니다.

+1

테이블 변수가 작동하지만 임시 테이블을 사용할 때 왜이 예외가 발생했는지 파악하려고했습니다. 테이블 변수가 적절하지 않은 다른 상황 (대용량 데이터 세트)이 있기 때문에 제 자신의 덕목에 대해 무엇이 일어나는지 이해하려고했습니다. –