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

Chr*_*ris 3 xml sql-server 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
Run Code Online (Sandbox Code Playgroud)

使用以下XML结构:

<settings>
    ...
    <resources>
        <type> ... </type>
        ...
    </resources>
    ...
</settings>
Run Code Online (Sandbox Code Playgroud)

然后生成此错误:

XQuery [dbo.Users.NewSettingsXml.modify()]: The target of 'replace' must be at most one node, found 'xs:string ?'

现在我意识到修改方法必须不能接受字符串作为路径,但有没有办法完成使用动态SQL的这个缺点?

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

谢谢!

Chr*_*ris 8

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

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
Run Code Online (Sandbox Code Playgroud)

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