Domanda

sto lavorando con il seguente codice XML

<AEDControl ControlGU="17fed98c-8128-4c6b-9b50-3dbe73889b9d" 
            ControlLabel="Posting Status" 
            TypeGU="6b4d08b1-6340-450c-beae-517b7d84e717" 
            ControlDescription="">
  <Elements>
    <Element ElementGU="2da346d1-2e05-4aa3-9bae-5aa9b3b75d5c" 
             Label="Active" 
             IsDefault="false"/>
    <Element ElementGU="fa8966fc-c796-4482-9ee1-f619910dc86e" 
             Label="Closed" 
             IsDefault="false"/>
    <Element ElementGU="d701a7d7-c3bd-496b-8d4b-b854a6937c3a" 
             Label="Filled" 
             IsDefault="false"/>
    <Element ElementGU="75af1941-f14f-4b7e-9f1e-5b6852c4a4f7" 
             Label="New" 
             IsDefault="false"/>
    <Element ElementGU="aa54e387-608e-4758-b4f2-c1dc485a5576" 
             Label="Pending" 
             IsDefault="true"/>
    <Element ElementGU="210aef5c-e4cf-4987-815f-0e4274b45e08" 
             Label="Scratch" 
             IsDefault="false"/>
 </Elements>

sto cercando di query da una stored procedure per tirare indietro un'etichetta sull'elemento che ha uno specifico ElementGU

I miei memorizzati sguardi procedura come questa:

SELECT 
   CAST(CONTROL_XML.query('data(/AEDControl/Elements/Element/@Label)') as varchar(100)) as ControlLabel 
FROM 
   Control
WHERE 
   CONTROL_XML.exist('/AEDControl/Elements/Element[@ElementGU = sql:variable("@SelectedValueGU")]') = 1

dove ElementGU è un passato nel campo uniqueidentifier.

I sembravano non avere fortuna con questo. Ho letto che non si può fare questo tipo di query dinamica con XQuery, ma allo stesso tempo, lo SLQ: variable () chiamata è parte di XQuery, quindi c'è qualcuno là fuori che può chiarire la situazione a me?

Sono ancora abbastanza nuovo sul fronte XQuery.

È stato utile?

Soluzione

È necessario affrontare questo un po 'diverso: poiché si dispone di una lista di nodi <Element>, vorrei suggerire di creare un elenco di nodi e poi scegliere quello giusto da quella lista - qualcosa di simile:

SELECT 
    AED.Element.value('(@Label)[1]', 'varchar(100)') as ControlLabel 
FROM
    Control
CROSS APPLY
    Control_XML.nodes('/AEDControl/Elements/Element') AS AED(Element)
WHERE
AED.Element.value('(@ElementGU)[1]', 'uniqueidentifier') = @SelectedValueGU

Non so come si desidera selezionare dalla tabella di base - se si vuole avere una clausola WHERE o qualcosa del genere - ma la CROCE SI APPLICANO è quasi esclusivamente il campo XML e crea una "pseudo-table" chiamato AED.Element dal nodi indicati nell'espressione XPath, e cross-applica quelli alla tabella di base. Così ora, per ogni voce in Control e ogni nodo <Element> in quelle righe, si ottiene una riga di dati.

In tale riga, è ora possibile scegliere tali righe in cui il valore @ElementGU corrisponde al valore passato in, e per quei nodi XML dove questo è il caso, quindi selezionare il valore dell'attributo @Label

Altri suggerimenti

Credo che questo XPath (con funzione di estensione sql:variable()) dovrebbe funzionare:

/AEDControl
 /Elements
  /Element[@ElementGU = sql:variable("@SelectedValueGU")]
   /@Label
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top