我正在尝试将xpath作为参数传递给查询。
declare @test as nvarchar(1000) = '(ns1:Book/Authors)[1]'
;with XMLNAMESPACES ('MyNameSpace:V1' as ns1)
select
b.XmlData.value(
'@test'
, 'nvarchar(100)') as QueriedData
from Books b
where b.BookID = '1'
上述声明给出了以下错误。
XQuery [Books.XmlData.value()]: Top-level attribute nodes are not supported
将其视为@test,而不是'@test'。并得到以下错误:
The argument 1 of the XML data type method "value" must be a string literal.
尝试使用'sql:variable(@test)'并得到此错误:
XQuery [Books.XmlData.value()]: A string literal was expected
将其视为'sql:variable(“@ test”)'并将@test中的值显示为QueriedData,这是错误的
请告诉我这里缺少什么
答案 0 :(得分:1)
您不能将变量用作XQuery表达式,但表达式可以引用变量。
set @ix = 2
with XMLNAMESPACES ('MyNameSpace:V1' as ns1)
select
b.XmlData.value(
'((ns1:Book/ns1:Authors)[sql:variable("@ix")])[1]'
, 'nvarchar(100)') as QueriedData
from Books b
where b.BookID = '1'
这包括元素名称。例如,要将节点名称放在参数中:
declare @elementName nvarchar(20) set @elementName = 'Authors'
with XMLNAMESPACES ('MyNameSpace:V1' as ns1)
select
b.XmlData.value(
'((//ns1:*)[ local-name()=sql:variable("@elementName") ] )[1]'
, 'nvarchar(100)') as QueriedData
这意味着“查找命名空间ns中的元素,其本地名称为@elementName,然后返回第一个。”