xml - XML 数据类型方法 "value"的参数 1 必须是字符串文字

标签 xml tsql

我已通读 SO:XML data type method “value” must be a string literal但我的问题有点不同。我在一个变量中有一些 xml,我想分开并给出一个路径。最初我试过这个:

declare @x xml
select @x = '....'
select @x.value('(' + @path + ')[1]', 'varchar(max)')

但是,当然,那失败了。然后我找到了 sql:variable 并尝试了这个:

select @x.value('(sql:variable("@path"))[1]', 'varchar(max)')

但这奇怪地返回了@path 的值(为什么?)。我一直在搞乱它,但无法让它做正确的事情。

有什么想法吗?

最佳答案

您的选择返回 @path 的值,因为 sql:variable() 返回一个文字值,所以实际上您要求 SQL 服务器选择文字值@path 来自文档,它确实如此。我知道做你想做的事情的唯一方法是使用动态 SQL,如下所示:

declare @xml xml = '
<root>
    <element attr="test">blah</element>
</root>';

declare @p nvarchar(max) = '(//element/text())[1]';
declare @sql nvarchar(max) 
    = 'select @x.value(''' + @p + ''', ''nvarchar(max)'')';

exec sp_executesql @sql, @parameters = N'@x xml', @x = @xml;

但我应该警告你,这不是很好的做法(考虑 SQL 注入(inject)、验证输入等)

关于xml - XML 数据类型方法 "value"的参数 1 必须是字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12397722/

相关文章:

mysql - OpenCart - XML 到 MySQL

php - PHP中如何合并具有相同id的数据?

tsql - 删除所有记录

sql - TSQL SELECT先前日期的记录

xml - JSONP 意外 token <

php - 将推文存储到数据库中的简单方法是什么?

sql - 消除并减少重叠的日期范围

html - SQL 查询到 HTML 表

html - 如何在 XML 中编码换行符

android - 为什么框架布局没有正确绘制 z 索引?