2017-04-20 68 views
0

尋找更有效的方式來根據查詢結果插入記錄。cfoutput裏面的cfquery查詢結果

例子:

<cfoutput query="actionInfo"> 
<cfquery datasource="cfdev"> 
insert into dbo.buttonActions 
(fID, bID, fieldID, aClear, aPress, aCheck, aUncheck, aCheckAll, aUncheckAll, tID) 
values 
('#newID#', '#bID#', '#fieldID#', '#aClear#', '#aPress#', '#aCheck#', '#aUncheck#', '#aCheckAll#', '#aUncheckAll#', '#tID#') 
</cfquery> 
</cfoutput> 

這將貫穿,並作出新的插入到數據庫中,通過對每個CFOUTPUT循環。我已經嘗試將cfoutput放入cfquery中,但每次都會遇到錯誤。

UPDATE:

這是最終爲我工作的基礎上,Dan的例子:

<cfquery datasource = "dsn"> 
insert into newTable 
(fID, field1, field2, etc) 
select '#newID#', field1, field2, etc -- the sql from q1 
</cfquery> 
+4

A)什麼是您的DBMS? B)你真的需要一個循環嗎?如果源表和目標表存在於同一數據庫和/或同一數據庫中,則可能不需要循環。 C)通常最有效的批量插入數據的方法是使用你的db批量加載工具。這些因dbms而異,但您沒有提及您使用的是哪一個。 (注意,*總是*使用cfqueryparam和變量查詢參數,特別是在循環時) – Leigh

+0

需要注意的另一件事:當你在cfoutput中放置一個cfquery時,你爲每個返回的行創建一個到數據庫的新連接在您的原始查詢中。這可能是一個巨大的瓶頸。我會遵循Dan的建議,並嘗試將其全部置於一個查詢或Leigh的建議中,並使用DB的批量數據加載工具。 – Shawn

+0

@Leigh謝謝你的好建議。一旦我瞭解了它,我一直在穩步地將我的代碼轉換爲cfqueryparam。是的,巨大的瓶頸是我想要避免的。想用只是一個SQL查詢來寫這個,沒有循環。看着丹的建議,但需要更多的信息才能實現。 – Phil

回答

0

如果初始查詢和插件都在同一個數據庫,你可能只需要一個查詢。這就是你現在正在做的事情;

<cfquery name="q1" datasource = "dsn"> 
select field1, field2, etc 
</cfquery> 

<cfoutput query="q1"> 
<cfquery datasource = "dsn"> 
insert into newTable 
(field1, field2, etc) 
values 
(#field1#, #field2#, #etc#) 
</cfquery. 
</cfoutput> 

你可以做的,而不是是這樣的:

<cfquery datasource = "dsn"> 
insert into newTable 
(field1, field2, etc) 
select field1, field2, etc -- the sql from q1 
</cfquery> 

取決於很多事情,這種做法甚至可能是可用的,如果數據庫是不同的。

這是一個建議。您提到將cfoutput放入查詢中。這是您可能沒有想到的方法。從上面使用相同的q1,

<cfquery datasource="dsn"> 
insert into newTable 
(field1, field2, etc) 
select null, null, etc 
from newTable 
where 1=2 
<cfloop query="q1"> 
union 
select #q1.field1[currentrow]#, #q1.field2[currentrow]#, etc 
from newTable 
</cfloop> 
</cfquery> 

您必須試驗這種方法。我已經看到它比現在運行得更快,而且我也看到它運行得更慢。

底線是,你有選擇,包括你目前的方法。有些時候我覺得最適合手頭的情況。

+0

如果您需要消除q1中的愚蠢,請使用UNION。如果模糊不清或使用了,請使用UNION ALL。 – Shawn

+0

一直在學習,謝謝你的好信息丹。我想嘗試一下你的第一個建議,但是如何通過查詢上行查詢獲得的#newID#值?基本上我需要複製一堆行,但更改副本上的fID字段。希望這是有道理的。 – Phil

+0

你問了一個普遍的問題,並得到了一個普遍的答案。如果您在ColdFusion中執行某些操作以生成數據(如新ID),我建議您提出另一個更具體的問題。 –