小编典典

ColdFusion:如何在一个插入中插入带有静态外键的列表?

sql

我有一个列表,例如: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。


阅读 182

收藏
2021-04-14

共1个答案

小编典典

更新:

最终,真正的问题在于,VALUES仅在SQL Server
2008+中支持使用单个子句插入多组值的功能,而OP使用的是2000。因此,它们改用select / union
all方法。


(从评论中扩展)

确保您可以在内循环cfquery。首先在CF服务器上处理所有cfml代码。然后,将所得的SQL字符串发送到数据库以执行。只要您的CF代码产生有效的SQL语句,您就可以做任何您想做的事情:)是否应该是一个不同的问题,但是这种循环是完全可以的。

回到您的问题,只需切换到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语句而不是循环直接将它们插入:

       INSERT INTO lkp_things (foreign_key, thing) 
       SELECT <cfqueryparam value="#id#" cfsqltype="...">, thing
       FROM   ThingTable
       WHERE  thing IN 
              (
                <cfqueryparam value="#thingList#" list="true" cfsqltype="..."> 
              )
2021-04-14