sql-server - 在 SQL Server XML 处理中为 modify() 参数化 XPath

标签 sql-server xml xpath

正如标题所暗示的那样,我试图为 SQL Server 中的 XML 数据列的 modify() 方法参数化 XPath,但遇到了一些问题。

到目前为止我有:

DECLARE @newVal varchar(50)
DECLARE @xmlQuery varchar(50)
SELECT @newVal = 'features'
SELECT @xmlQuery = 'settings/resources/type/text()'

UPDATE  [dbo].[Users]
SET     [SettingsXml].modify('
    replace value of (sql:variable("@xmlQuery"))[1]
    with sql:variable("@newVal")')
WHERE   UserId = 1

具有以下 XML 结构:

<settings>
    ...
    <resources>
        <type> ... </type>
        ...
    </resources>
    ...
</settings>

然后生成此错误:

XQuery [dbo.Users.NewSettingsXml.modify()]: 'replace' 的目标最多只能是一个节点,找到 'xs:string ?'

现在我意识到修改方法一定不能接受字符串作为路径,但是有没有办法在不使用动态 SQL 的情况下完成这一任务?

哦,顺便说一句,我使用的是 SQL Server 2008 Standard 64 位,但我编写的任何查询都需要兼容回 2005 Standard。

谢谢!

最佳答案

如果有人感兴趣,我自己使用动态查询想出了一个相当不错的解决方案:

DECLARE @newVal nvarchar(max)
DECLARE @xmlQuery nvarchar(max)
DECLARE @id int

SET @newVal = 'foo'
SET @xmlQuery = '/root/node/leaf/text()'
SET @id = 1

DECLARE @query nvarchar(max)

SET @query = '
    UPDATE  [Table]
    SET     [XmlColumn].modify(''
        replace value of (' + @xmlQuery + '))[1]
        with sql:variable("@newVal")'')
    WHERE Id = @id'

EXEC sp_executesql @query,
                   N'@newVal nvarchar(max) @id int',
                   @newVal, @id

使用它,动态查询唯一不安全的部分是 xPath,在我的例子中,它完全由我的代码控制,因此不应该被利用。

关于sql-server - 在 SQL Server XML 处理中为 modify() 参数化 XPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6346727/

相关文章:

python - python 中的 XML 解析 : expaterror not well-formed

java - 如何在计时器中通过 java 旋转 android 中布局背景的图片?

python - 值匹配的 jsonpath 表达式

sql - 如何将money和s​​mallmoney的所有SQL列更改为十进制?

sql - 需要帮助找到正确的 T-SQL 查询

c# - 将 XML 数据放入 Windows 事件日志

xml - 我如何使用 xpath 表达式从以下数据中找出 productID 的最小值和最大值

php - 无法使用php中的xquery从xhtml获取带有xpath的两个子元素来操作

sql - SQL Server 中 FOR XML PATH 查询的列作为内容

sql-server - 根据连接选择更新 SQL 记录