0

アプリケーションからSQLマップを実行しようとすると、無効な列名が表示されます。基本的に、2つの別々のマッピングファイルがあります。これらは、異なる名前で列を作成することを除いて、基本的に同じことを行います。この問題を説明するために、わざとDROPTABLEを省略していることに注意してください。これが悪い習慣であることは知っていますが、なぜこれが起こるのかを探しています。その後、すべてのSQLマップにテーブルを明示的に削除することで、この動作を修正しました。

クエリ1:

<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を実行します。正常に実行され、SQLManagementStudioで作成された一時テーブルが表示されます。次に、Query2を実行して、次のスタックトレースを取得します。

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でQuery2のSQLを実行すると、正しく実行されます。実際、これらのクエリは両方ともSMSで正しく実行されます。iBatisがどのように機能するかを詳細に理解していませんが、iBatisはQuery1で作成された一時テーブルを確認し、そのスキーマに対してQuery2の構文を検証しているようです。この場合、無効な列名の例外がスローされます。ただし、これは、iBatisが一時テーブルへの参照を保持していることを意味します。これは、一時テーブルが接続にスコープされるSQLサーバーのパラダイムと矛盾します。

誰かがここで何が起こっているのか説明できますか?

4

2 に答える 2

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 値がすでに保証されています。

于 2012-12-13T22:14:03.320 に答える