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.
谢谢!
如果有人感兴趣,我自己使用动态查询想出了一个相当不错的解决方案:
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,在我的例子中,它完全由我的代码控制,因此不应该被利用.
| 归档时间: |
|
| 查看次数: |
5698 次 |
| 最近记录: |