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 

これは、「@elementName のローカル名を持つ名前空間 ns で要素を検索し、最初のものを返す」ことを意味します。

于 2013-03-04T14:35:02.633 に答える