【问题标题】:cfquery inside of cfoutput query resultscfoutput 查询结果中的 cfquery
【发布时间】:2017-09-16 10:20:27
【问题描述】:

寻找一种更有效的方法来根据查询结果插入记录。

例子:

<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 中,但每次都遇到错误。

更新:

根据 Dan 的示例,这就是最终为我工作的方法:

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

【问题讨论】:

  • A) 您的 DBMS 是什么? B)你真的需要一个循环吗?如果源表和目标表存在于同一数据库和/或同一数据库中,则可能不需要循环。 C)通常最有效的批量插入数据的方法是使用你的数据库的批量加载工具。这些因dbms而异,但您没有提及您使用的是哪一个。 (旁注,总是使用带有可变查询参数的 cfqueryparam。尤其是在循环时)
  • 要记住的另一件事:当您将 cfquery 放入 cfoutput 中时,您正在为原始查询中返回的每一行建立与数据库的新连接。这可能是一个巨大的瓶颈。我会听从 Dan 的建议,尝试将所有内容放在一个查询或 Leigh 的建议中,并使用数据库的批量数据加载工具。
  • @Leigh 感谢您的好建议。一旦我了解了它,我就一直在稳定地将我的代码转换为 cfqueryparam。是的,巨大的瓶颈是我试图避免的。想用一个 SQL 查询来写这个,没有循环。查看 Dan 的建议,但需要更多信息才能实现。
  • @Phil - 以上问题的答案将确切地确定您可以使用哪些选项:)。你能再看看并告诉我们 A) 你正在使用哪些 dbms,SQL Server、MySQL 等等。 (顺便说一句,SQL 语法通常因供应商而异,因此使用任何查询问题指定 DBMS 总是一个好主意)。 b) 另外,#actionInfo# 的来源是什么?该查询中的数据是否来自同一数据库中的另一个表、不同的数据库、同一服务器、外部服务器、电子表格...?

标签: sql coldfusion


【解决方案1】:

如果初始查询和插入在同一个数据库中,您可能只需要一个查询。这就是你现在正在做的;

<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>

您必须尝试这种方法。我看到它运行得比你现在做的快,而且我也看到它运行得更慢。

最重要的是,您确实有选择,包括您当前的方法。有时我发现它最适合手头的情况。

【讨论】:

  • 如果您需要在 q1 中消除欺骗,请使用 UNION。如果欺骗是 OK 或预期的,请使用 UNION ALL。
  • 一直在学习,感谢 Dan 提供的好信息。我想尝试您的第一个建议,但我将如何传递我从查询中获得的#newID# 值?基本上我需要复制一堆行,但更改副本上的 fID 字段。希望这是有道理的。
  • 您提出了一般性问题并得到了一般性答案。如果你在 ColdFusion 中做一些事情来生成数据,比如新的 ID,我建议你再问一个更具体的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多