当我尝试从应用程序运行SQL映射时,我收到的列名无效。基本上我有两个单独的映射文件,基本上做同样的事情,除了创建一个具有不同名称的列。请注意,我已故意离开DROP TABLE来说明此问题。我知道这是一个不好的做法但我正在寻找为什么会发生这种情况。我们已经通过在每个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。执行得很好,我看到在SQL Management Studio中创建的临时表。然后我执行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服务器范例相矛盾。
有人能解释这里发生了什么吗?
答案 0 :(得分: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 :(得分:0)
由于您要插入数据的表的列名与您从中获取数据的表不匹配,因此抛出错误。
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
在上面的代码片段中,您在内部查询中选择valueCode并将其插入到##严重性临时表中,该表没有valueCode列名。