0

我正在尝试将 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,这是错误的

请告诉我我在这里缺少什么

4

1 回答 1

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,然后返回第一个。”

于 2013-03-04T14:35:02.633 回答