【发布时间】: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