Обновление нескольких строк из набора записей cfquery
-
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>
Не связан с StackOverflow