2012-07-17 121 views
4
<CFIF ListLen(SESSION.WHSurveyStruct.reasonString, ";") gt 0> 
    <CFQUERY name="insertReasons" datasource="#REQUEST.dsn#"> 
     INSERT INTO TWelcomeHome_Reason 
     (ReasonID, SubReasonID, SurveyID) 
     SELECT #sanitize(ListFirst(SESSION.WHSurveyStruct.reasonString, ";"))#, #sanitize(getLatestSurveyID.SurveyID)# 
     <CFLOOP list="#sanitize(ListRest(SESSION.WHSurveyStruct.reasonString, ';'))#" index="thisReason" delimiters=";"> 
      UNION ALL 
      SELECT #sanitize(thisReason)#, #sanitize(getLatestSurveyID.SurveyID)# 
     </CFLOOP> 

    </CFQUERY> 

我试图理解这是干什么的。我对循环感到困惑,为什么select语句没有FROM?好吧,他们只是标量。为什么这个SELECT语句没有FROM?

怎么样在循环的外部和内部有一条select语句?我有点不明白union all。以及如何指定3列(ReasonID,SubReasonID,SurveyID),但每个值都给出了?

倾倒:

结构

CACHED:假EXECUTIONTIME:0总记录:8 SQL:INSERT INTO TWelcomeHome_Reason(ReasonID,SubReasonID,SurveyID)SELECT 6, 18,245 UNION ALL
SELECT 6,21,245
UNION ALL
SELECT 6,24,245
UNION A LL
SELECT 3,5,245
UNION ALL
SELECT 3,6,245
UNION ALL
SELECT 3,8,245
UNION ALL
SELECT 3,11,245
UNION ALL
SELECT 3,7,245


+0

'UNION ALL'模拟结果集。这是一种将多个记录合并在一起并一次性插入的方法。至于在'INSERT'列表中的列数与结果集中的列数有什么不同,那应该不行*。我会检查调试输出以验证它甚至可以执行。如果确实如此,我会感到惊讶,因为不匹配会导致语法错误。 – Leigh 2012-07-17 19:54:29

+0

@Leight足够舒适,它的工作。必须是某种黑客。 – Celeritas 2012-07-17 19:58:10

+0

嗯..该代码生成的实际sql是什么?将'result'属性添加到查询和'cfdump'中。 – Leigh 2012-07-17 19:59:24

回答

16

它看起来像我t只是标量值,不包括任何表中的记录。所以

INSERT INTO myTable 
SELECT 'foo' 
UNION ALL 
SELECT 'bar' 

将两个记录插入myTable的,foobar

7

简短的回答是,它不是从表中选择。所以从FROM没有表格。

如果执行:

INSERT INTO TableSomething (ColumnA) 
SELECT 'A' 
UNION ALL 
SELECT 'B' 

它会插入A和B为ColumnA。

ColdFusion创建的数据插入而不是从表中拉出。