TSQL:我如何一次将变量和文本插入到单个字段中

时间:2016-08-01 17:53:54

标签: sql sql-server tsql

我有以下代码来更新MIITEM中的记录工作正常,但我怎样才能使用另一个名为[WI]动态的表中的数据

use DB1;
Go
update MIITEM
set [fldXml]= '<fields>
<field5>USE DISC:300230 FORMED OD:13.48 BH SPEC:8/8/6.003, BH Size: 0.656, C/S Spec: 90/0.843/CONICAL 2</field5>
<field6>1 - CL THRU PLATE-V/S HOLE SIZE:5/8&quot;Z1 V:0.125 L:0.125  COLOR:100270 AGC REVERSE DISC</field6>
<field7>N/A</field7>
</fields>'
where [itemId]='500201'

这里的数据看起来像源表

enter image description here

以下是应用程序中的数据

enter image description here

以下是MIITEM或目的地表enter image description here

中的记录
  

我想用动态[WI]表中的[wi]。[DISC_NOTE]字段中的值替换文本USE DISC:300230 FORMED OD:13.48 BH SPEC:8/8/6.003, BH Size: 0.656, C/S Spec: 90/0.843/CONICAL 2

     

我想动态地用值[wi]。[WHEEL_NOTE]字段替换1 - CL THRU PLATE-V/S HOLE SIZE:5/8&quot;Z1 V:0.125 L:0.125 COLOR:100270 AGC REVERSE DISC

     

我想从[WI]表中替换N/A [wi]。[ASSEMBLY_NOTE]字段。在动态字段之间进行

1 个答案:

答案 0 :(得分:3)

您可以将TSQL XML DML用于此目的(假设fldXmlxml数据类型)。查询看起来像这样。

update MIITEM
set [fldXml].modify('replace value of (fields/field5)[1]
                     with sql:column("DISC_NOTE")')
from MIITEM m 
     inner join wi on m.idemid=wi.stock_id
--where m.idemid='500201' --if you need it

请注意,您必须运行update trice(对于每个field5,field6和field7分别运行),因为XML DML不允许多节点更新。

更新

如果fldXml是一个字符串,那么您需要比较构建整个字符串

之间的开销
fldXml='<fields><field5>'+wi.disc_note+...

并创建临时表。

declare @MIITEM table (itemid int, fldXml xml)
insert @MIITEM (itemid, fldXml)
from MIITEM 
--where... if you need

然后根据初始答案多次为每个节点更新@MIITEM,最后

update MIITEM
set [fldXml]=x.fldXml 
from MIITEM t
     inner join @MIITEM x on t.itemid = x.itemid