sql-server - 使用 XQUERY 更新 SQL 服务器 xml 列?

标签 sql-server xml sql-server-2008 xquery

我在 XML 列中有一个简单的 xml

<Bands>
    <Band>
        <Name>beatles</Name>
        <Num>4</Num>
        <Score>5</Score>
    </Band>
    <Band>
        <Name>doors</Name>
        <Num>4</Num>
        <Score>3</Score>
    </Band>
</Bands>

我已经设法更新了列:

   -----just update the name to the id)----
   UPDATE tbl1
   SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
   with sql:column("id")')

一切顺利。

问题 #1

如何使用此查询将值更新为 id+"lalala":

   UPDATE tbl1
   SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
   with sql:column("id") + "lalala"')

错误 = XQuery [tbl1.myXml.modify()]:'+' 的参数必须是单个数字原始类型

问题 #1

假设我不想更新第一条记录 ([1]) ,但我只想在 处更新 udpate (与上面相同的更新) >分数>4

我可以在 xpath 中写 ofcourse :

替换 (/Bands/Band[Score>4]/Name/text())[1] 的值

但我不想在 Xpath 中执行此操作。难道没有使用 Where 子句的正常方法吗?

类似的东西:

   UPDATE tbl1
   SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
   with sql:column("id")  where [...score>4...]')

here is the online sql

最佳答案

如果你想连接字符串你应该使用concat如果 id 在您的情况下是一个整数,您需要将其转换为 concat 函数中的字符串。

在where子句中你可以过滤要更新的表的行,你不能在XML中指定要更新哪些节点。这必须在 xquery 表达式中完成。但是,您可以使用 exist在 where 子句中过滤掉真正需要更新的行。

update tbl1
set myXml.modify('replace value of (/Bands/Band[Score > 4]/Name/text())[1] 
                    with concat(string(sql:column("id")), "lalalala")')
where myXml.exist('/Bands/Band[Score > 4]') = 1

关于sql-server - 使用 XQUERY 更新 SQL 服务器 xml 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13594741/

相关文章:

java - 为服务类创建对象不起作用

xml - ODI-1227 : ActiveMQObjectMessage cannot be cast to javax. jms.BytesMessage

sql-server - 如何查询当前用户的角色

sql-server - 使用sql server跨陆地两点之间的距离

SQL Server Merge,如何按日期范围(年)对目标进行子集化

c# - 存储过程看不到在同一连接中创建的临时表

sql-server - NPM 安装错误 - Msnodesql

sql-server - 查找文件夹安装的 sql 版本(!)?

javascript - 将 HTML 表格转换为 XML

sql - 如何编写 WHERE 子句来查找特定月份的所有记录?