新答案
xml 特殊字符


只不过是一个新行(换行符(LF)和回车符(CR ))。我不认为这应该真正存在于XML 的价值范围内。换行应该添加到您的表示层中。
以下代码显示了如何在不需要变量或任何强制转换的情况下更新表格的方式。
DECLARE @tbl TABLE(ID INT IDENTITY, testXML XML);
INSERT INTO @tbl (testXML)
values ('<R>
<P N="Status" V="
Draft
" />
<P N="Approved For Publishing" V="
T
" />
<P N="Concealed From Publishing" V="
F
" />
<P N="Management System" V="
OMS
BMS
" />
</R>')
,('<R>
<P N="Status" V="
Draft
" />
<P N="Approved For Publishing" V="
T
" />
<P N="Concealed From Publishing" V="
F
" />
<P N="Management System" V="
OMS
BMS
" />
</R>');
UPDATE @tbl SET testXML=testXML.query(
N'
<R>
{
for $p in /R/P
return
if($p/@N="Approved For Publishing") then
<P N="{$p/@N}" V="F"/>
else
<P N="{$p/@N}" V="{substring($p/@V,3,string-length($p/@V)-4)}"/>
}
</R>
');
SELECT * FROM @tbl;
操作后其中一个 XML 将如下所示:
<R>
<P N="Status" V="Draft" />
<P N="Approved For Publishing" V="F" />
<P N="Concealed From Publishing" V="F" />
<P N="Management System" V="OMS
BMS" />
</R>
这种方法之间的新界限OMS
仍然BMS
存在。
上一个答案
先发表一些评论/问题?
- 为什么您需要将其转换为
VARCHAR(MAX)
然后再转换为XML
(隐式)?
- 您需要更新表中的值还是临时操作?
- 您不能一次更新多个值
.modify()
...
- 如果您处理 XML,您应该始终使用!
NVARCHAR
- 是否需要变量
@myDoc
?
您可以尝试使用FLWOR XQuery
:
DECLARE @tbl TABLE(testXML XML);
INSERT INTO @tbl (testXML)
values ('<R>
<P N="Status" V="
Draft
" />
<P N="Approved For Publishing" V="
T
" />
<P N="Concealed From Publishing" V="
F
" />
<P N="Management System" V="
OMS
BMS
" />
</R>');
DECLARE @myDoc xml
SET @myDoc = (SELECT TOP 1 CAST(testXML AS VARCHAR(MAX)) FROM @tbl)
SELECT @myDoc.query(
N'
<R>
{
for $p in /R/P
return
if($p/@N="Approved For Publishing") then
<P N="{$p/@N}" V="F"/>
else
<P N="{$p/@N}" V="T"/>
}
</R>
')
结果
<R>
<P N="Status" V="T" />
<P N="Approved For Publishing" V="F" />
<P N="Concealed From Publishing" V="T" />
<P N="Management System" V="T" />
</R>