2012-07-17 44 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創建的數據插入而不是從表中拉出。