Обновление нескольких строк из набора записей cfquery

StackOverflow https://stackoverflow.com//questions/20007935

  •  20-12-2019
  •  | 
  •  

Вопрос

Есть ли способ обновить несколько строк данных, если поступающие данные получены в результате запроса CFQuery?В настоящее время этот запуск <cfquery> много раз.Есть ли способ сделать это за одну операцию uqery?

<cfloop query=loc.fixItems>
    <cfset loc.count++>
    <cfset var categoryName = loc.fixItems.categoryName>


    <cfquery>
      update items
      set code = <cfqueryparam value="#code#">
      where id = <cfqueryparam value="#itemId#">
    </cfquery>
</cfloop>

Это может запускаться несколько раз и создавать большую нагрузку на сервер.

Это было полезно?

Решение 2

Загрузка данных в переменную XML и массовое обновление

<cfsavecontent variables="xmlData">
<ul class="xoxo">
   <cfoutput query="loc.fixItems">
     <li><b>#xmlformat(id)#</b> <code>#code#</code></li>
   </cfoutput>  
 </ul>
 </cfsavecontent>

 <!---
 <cfoutput>#xmlData#</cfoutput>
 --->

 <cfquery>
 DECLARE @xmlData xml = <cfqueryparam cfsqltype="CF_SQL_varchar" value="#xmlData#">


 ;
 WITH Data (id, code) AS (
    SELECT  tbl.Col.value('b[1]','varchar(20)') AS ID,
    tbl.Col.value('code[1]','varchar(50)') AS Code
    FROM    @xmlData.nodes('/ul/li') tbl(Col)
    )

 UPDATE items
   SET items.code = Data.code
 FROM items
 INNER JOIN Data
   ON items.id = Data.id    
 </cfquery>

Другие советы

Вы должны иметь возможность поместить свой цикл внутри cfquery

<cfquery>
  <cfloop query=loc.fixItems>
    <cfset loc.count++>
    <cfset var categoryName = loc.fixItems.categoryName>    
    update items
    set code = <cfqueryparam value="#code#"> -- code needs to be dynamic
    where id = <cfqueryparam value="#itemId#">; -- itemId needs to be dynamic
  </cfloop>
</cfquery>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top