gpt4 book ai didi

sql - MSSQL 中带有 XML 查询的存储过程参数给出 "argument must be string literal"

转载 作者:行者123 更新时间:2023-12-04 05:53:22 25 4
gpt4 key购买 nike

我正在尝试使用查询和值函数查询包含 xml 数据列的表。使用常规字符串文字时一切正常,但如果我将其放入存储过程并尝试使用变量,则它不起作用。

我想我没有使用正确的数据类型,但经过一些搜索后,我无法弄清楚查询函数想要什么数据类型。

例子:
表包含

| Id | xmldata                         |
| 1 | <data><node>value</node></data> |

现在,使用选择查询
select id
from table
where xmldata.query('/data/node').value('.', 'VARCHAR(50)') = 'value'

让我得到我想要的数据。但是,如果我在存储过程中使用它并使用参数 @xpath varchar(100)并将其作为 xmldata.query(@xpath) 传递给查询方法
我得到了错误
The argument 1 of the xml data type method "query" must be a string literal.

我猜 varchar(100) 不正确,但是我可以使用哪种数据类型让 MSSQL 满意?

更新:
可以,然后呢。显然,您不能“就这样”将参数传递给查询方法,但是可以将 sql:variable 与 local-name 结合使用来解决其中的一部分。因此,例如,这将起作用
declare @xpath VarChar(100)
set @xpath='node'
select objectData.query('/data/*[local-name() = sql:variable("@xpath")]')
.value('.', 'varchar(100)') as xmldata
from table

并且在列 xmldata 中选择了值。但是(!)它要求根节点是查询函数中的第一个值。以下将不起作用
declare @xpath VarChar(100)
set @xpath='/data/node'
select objectData.query('*[local-name() = sql:variable("@xpath")]')
.value('.', 'varchar(100)') as xmldata
from table

注意查询路径是如何“上移”到变量的。我会继续调查。。

最佳答案

一个 literalvariable 相反.该消息意味着您不能将变量作为第一个参数传递给 query .

一种解决方法是动态 SQL:

declare @sql varchar(max)
set @sql = 'select id from table where xmldata.query(''' + @path +
''').value(''.'', ''VARCHAR(50)'') = ''value'''
exec @sql

如您所见,动态 SQL 不会产生非常易读的代码。我当然会研究替代方案。

编辑:您对 local-name() 的建议适用于节点名称。
declare @nodename varchar(max)
set @nodename = 'node'
...
where xmldata.query('//*[local-name()=sql:variable("@nodename")]')
.value('.', 'varchar(50)') = 'value'

路径似乎没有等价物。

关于sql - MSSQL 中带有 XML 查询的存储过程参数给出 "argument must be string literal",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9805920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com