xml用变量查询

时间:2013-03-04 12:46:28

标签: sql-server xml

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

请告诉我这里缺少什么

1 个答案:

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