我有一个列表,例如:thing1,thing2,thing3。我想将它们插入具有相同外键的查找表中。因此理想情况下,它看起来应该像这样:
<cfquery datasource="#ds#" result="insert_things"> INSERT INTO lkp_things (foreign_key, thing) VALUES (1, thing1), (1, thing2), (1, thing3) </cfquery>
看来完成此操作的唯一方法是将列表转换为查询,但是我想知道,是否有更简单的方法?
这是我尝试过的:
<cfquery datasource="#ds#" result="insert_things"> INSERT INTO lkp_things (foreign_key, thing) VALUES <cfloop list="#things#" index="thing"> (#id#,#thing#)<cfif ?????? NEQ len(#things#)>,</cfif> </cfloop> </cfquery>
我听说您无法在cfquery中执行cfloop,但是我什至不确定这是否成立,因为VALUES中没有逗号,并且我不确定如何说“ cfloop中的“当前迭代编号”。如果将列表转换为查询,则可以执行currentRow,但是再次,我想在进行所有操作之前先知道是否有更简单的方法来完成此操作。
另外,我正在使用CF 8和sql server ‘08编辑:对不起,我实际上是在使用2000。
更新:
最终,真正的问题在于,VALUES仅在SQL Server 2008+中支持使用单个子句插入多组值的功能,而OP使用的是2000。因此,它们改用select / union all方法。
VALUES
(从评论中扩展)
确保您可以在内循环cfquery。首先在CF服务器上处理所有cfml代码。然后,将所得的SQL字符串发送到数据库以执行。只要您的CF代码产生有效的SQL语句,您就可以做任何您想做的事情:)是否应该是一个不同的问题,但是这种循环是完全可以的。
cfquery
回到您的问题,只需切换到from/to循环,然后使用列表函数(如getToken(list, index)获取单个元素)或使用数组即可。显然,您还应该首先验证列表是否为空。我个人的喜好是数组。未经测试,但类似这样:
from/to
getToken(list, index)
<cfset thingArray = listToArray(things, ",")> <cfquery datasource="#ds#" result="insert_things"> INSERT INTO lkp_things (foreign_key, thing) VALUES <cfloop from="1" to="#arrayLen(thingArray)#" index="x"> <cfif x gt 1>,</cfif> ( <!--- Note: Replace cfsqltype="..." with correct type ---> <cfqueryparam value="#id#" cfsqltype="..."> , <cfqueryparam value="#thingArray[x]#" cfsqltype="..."> ) </cfloop> </cfquery>
话虽如此,您的#thing#名单的来源是什么?如果这些值存在于数据库表中,则可以使用SELECT语句而不是循环直接将它们插入:
#thing#
SELECT
INSERT INTO lkp_things (foreign_key, thing) SELECT <cfqueryparam value="#id#" cfsqltype="...">, thing FROM ThingTable WHERE thing IN ( <cfqueryparam value="#thingList#" list="true" cfsqltype="..."> )