系统运维.数据库.修改元数据XML
【应用场景】
元数据出了状况,BOSIDE已经无法正常打开元数据设计界面或者XML界面,已经无法通过BOSIDE修改元数据。此时,为了修复该元数据,使得其能再次在BOSIDE中打开,可以通知直接数据库修改XML的方式处理。
【警告】执行SQL语句更新前,请先备份账套或者备份数据表。
【案例演示】
采购订单,新增文本字段1,文本字段2,通过SQL将文本字段2从元数据XML中移除。
【实现步骤】
<1>BOSIDE扩展采购订单,新增文本字段1,文本字段2。
<2>数据库查询下对应采购订单扩展的元数据。
SELECT * FROM T_META_OBJECTTYPE WHERE FID='3a9178d4-26c3-4497-b8ae-38a66f26b15b';
<3>根据元数据XML节点结构,编写更新SQL,并执行该SQL。
-- 删除字段
UPDATE T_META_OBJECTTYPE SET FKERNELXML.modify('delete /FormMetadata/BusinessInfo/BusinessInfo/Elements/TextField[1]') WHERE FID='3a9178d4-26c3-4497-b8ae-38a66f26b15b';
-- 删除字段的外观
UPDATE T_META_OBJECTTYPE SET FKERNELXML.modify('delete /FormMetadata/LayoutInfos/LayoutInfo/Appearances/TextFieldAppearance[1]') WHERE FID='3a9178d4-26c3-4497-b8ae-38a66f26b15b';
--【tips】SQL中的下标是指元素在节点下的索引,从1开始。
<4>执行成功后,再次检查元数据。
---------------------------------------------------------------------------------------------------------
【更多写法示例】
-- 修改用户参数的某个参数值
UPDATE T_BAS_USERPARAMETER SET FPARAMETERS.modify('replace value of (/BillUserParameter/FAutoSaveLayout/text())[1] with "True"') WHERE FPARAMETEROBJID='PUR_PurchaseOrder' AND FKEY='UserParameter' AND FUSERID=100008
-- 删除用户参数的某个参数值
UPDATE T_BAS_USERPARAMETER SET FPARAMETERS.modify('delete /BillUserParameter/FAutoSaveLayout') WHERE FPARAMETEROBJID='PUR_PurchaseOrder' AND FKEY='UserParameter' AND FUSERID=100008
--修改元数据中的第一个基础资料属性字段的Key
UPDATE T_META_OBJECTTYPE SET FKERNELXML.modify('replace value of (/FormMetadata/BusinessInfo/BusinessInfo/Elements/BasePropertyField/Key/text())[1] with "F_Jac_BaseProperty555"')
WHERE FID='ca76da0a-8811-41f5-849d-a46bb5a8d327'
--修改元数据中的第一个基础资料属性字段的外观Key
UPDATE T_META_OBJECTTYPE SET FKERNELXML.modify('replace value of (/FormMetadata/LayoutInfos/LayoutInfo/Appearances/BasePropertyFieldAppearance/Key/text())[1] with "F_Jac_BaseProperty555"')
WHERE FID='ca76da0a-8811-41f5-849d-a46bb5a8d327'
--修改元数据中的第二个基础资料属性字段的Key
UPDATE T_META_OBJECTTYPE SET FKERNELXML.modify('replace value of (/FormMetadata/BusinessInfo/BusinessInfo/Elements/BasePropertyField[2]/Key/text())[1] with "F_Jac_BaseProperty888"')
WHERE FID='ca76da0a-8811-41f5-849d-a46bb5a8d327'
--修改元数据中的第二个基础资料属性字段的外观Key
UPDATE T_META_OBJECTTYPE SET FKERNELXML.modify('replace value of (/FormMetadata/LayoutInfos/LayoutInfo/Appearances/BasePropertyFieldAppearance[2]/Key/text())[1] with "F_Jac_BaseProperty888"')
WHERE FID='ca76da0a-8811-41f5-849d-a46bb5a8d327'
---------------------------------------------------------------------------------------------------------
https://blog.csdn.net/beyondqd/article/details/8217704
/*------------------------------------------------------------------------------------------------------------------
modify() 方法是使用 XML DML 语句在 XML 数据中插入、更新或删除节点。
语法:modify (XML_DML) XML_DML 是 XML 数据操作语言 (DML) 中的字符串。
XML DML 将下列区分大小写的关键字添加到 XQuery 中:
insert --添加
delete --删除
replace value of --更新
------------------------------------------------------------------------------------------------------------------*/
DECLARE @x XML
SET @x='
<root>
<rogue id="001">
<hobo id="1">
<name>彪</name>
<type>流氓</type>
</hobo>
</rogue>
</root>'
------------------------------------------------------插入------------------------------------------------------------
--在 hobo 节点下插入 一个新节点
SET @x.modify('
insert <nickname>阿彪</nickname>
as first
into (/root/rogue/hobo)[1]
');
SELECT @x
--注释:如果某节点下面有多个节点的时候可以使用 as first 或 as last 来指定所需的新节点添加位置。
---在指定的 hobo 节点下,插入同一级节点
SET @x.modify('
insert <id>1</id>
before (/root/rogue/hobo)[1]
');
SELECT @x
--注释:是用 before 或者 after 关键字代替 into 在指定节点的 前面 或者 后面 插入同级节点
--after 关键字 和 before 关键字不能用于插入属性
--插入属性 一次插入多个属性值/使用变量/属性定位
DECLARE @a INT =5
SET @x.modify('
insert (
attribute a {sql:variable("@a")},
attribute b {".5"}
)
into (/root/rogue/hobo[@id=1])[1]
');
SELECT @x;
GO
----------------------------------------------------删除------------------------------------------------------------
DECLARE @x XML
SET @x='
<?Instructions for=TheWC.exe ?>
<root>
<rogue id="001">
<hobo id="1" weight="80" age="25">
<name>彪</name>
<type>流氓</type>
<nickname>阿彪</nickname>
<notes />
</hobo>
<page_hotspots />
</rogue>
<notes />
</root>'
-- 删除属性
SET @x.modify('
delete /root/rogue/hobo/@id
')
SELECT @x
-- 删除节点
SET @x.modify('
delete /root/rogue/hobo/name[1]
')
SELECT @x
-- 删除节点内容
SET @x.modify('
delete /root/rogue/hobo/type/text()
')
SELECT @x
-- 删除所有处理指令
SET @x.modify('
delete //processing-instruction()
')
SELECT @x
-- 删除所有的内容为空的节点
SET @x.modify('
delete //*[empty(./*)]
')
SELECT @x
----------------------------------------------------修改------------------------------------------------------------
DECLARE @x XML
SET @x='
<root>
<rogue id="001">
<hobo id="1" weight="80" age="25">
<name>彪</name>
<type>流氓</type>
<nickname>阿彪</nickname>
</hobo>
</rogue>
</root>'
-- 在修改语法当中 每次只能修改一个单个节点,不能批量修改或者一次修改多个值,这一点是比较郁闷的
-- 修改节点值
SET @x.modify('
replace value of (/root/rogue/hobo/name/text())[1]
with "光辉"
')
SELECT @x
-- 修改属性值
SET @x.modify('
replace value of (/root/rogue/hobo/@weight)[1]
with "70"
')
SELECT @x
-- 使用 if 表达式
SET @x.modify('
replace value of (/root/rogue/hobo/@age)[1]
with (
if (count(/root/rogue/hobo/*) > 2) then
"30"
else
"10"
)
')
SELECT @x
------------------------------------------------------一些示例------------------------------------------------------------
-- 1
DECLARE @x1 XML
SELECT @x1 = '
<rogue>
<hobo name="彪"/>
<hobo name="光辉"/>
<hobo name="小D"/>
<hobo name="野子"/>
</rogue>'
------------------------------------------------------------
-- 把 小D 移动到 彪 前面
------------------------------------------------------------
SET @x1.modify('
insert /rogue/hobo[@name="小D"]
before (/rogue/hobo[@name="彪"])[1]
')
SET @x1.modify ('
delete (/rogue/hobo[@name="小D"])[2]
')
SELECT @x1
---------- --------------------------------------------------
-- 把 光辉 移动到 野子 后面
------------------------------------------------------------
SET @x1.modify('
insert /rogue/hobo[@name="光辉"]
after (/rogue/hobo[@name="野子"])[1]
')
SET @x1.modify ('
delete (/rogue/hobo[@name="光辉"])[1]
')
SELECT @x1
------------------------------------------------------------
-- 把 野子 向前移动一级
------------------------------------------------------------
SET @x1.modify('
insert /rogue/hobo[@name="野子"]
before (/rogue/hobo[. << (/rogue/hobo[@name="野子"])[1]])[last()]
')
SET @x1.modify ('
delete /rogue/hobo[@name="野子"]
[. is (/rogue/hobo[@name="野子"])[last()]]
')
SELECT @x1
------------------------------------------------------------
-- 把 彪 向后 移一级
------------------------------------------------------------
set @x1.modify('
insert /rogue/hobo[@name="彪"]
before (/rogue/hobo[. >> (/rogue/hobo[@name="彪"])[1]])[2]
')
SELECT @x1
SET @x1.modify ('
delete (/rogue/hobo[@name="彪"])[1]
')
SELECT @x1
------------------------------------------------------------
-- 使用变量修改属性名称
------------------------------------------------------------
DECLARE @x2 XML
SELECT @x2 = '
<Employees>
<Employee FirstName="Jacob" MiddleName="V" LastName="Sebastian"/>
</Employees>'
DECLARE @var VARCHAR(20)
DECLARE @val VARCHAR(20)
SELECT @var = 'MiddleName'
SELECT @val = 'J'
SET @x2.modify('
replace value of (
/Employees/Employee/@*[local-name()=sql:variable("@var")]
)[1]
with sql:variable("@val")
')
SELECT @x2
---------------------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
系统运维.数据库.修改元数据XML
本文2024-09-23 04:18:19发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-164453.html