正如标题所暗示的那样,我试图为 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/