2017-04-20 40 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),我建议您提出另一个更具体的问题。 –