Domanda

La tabella stock ELMAH_Error utilizza un campo nText per memorizzare una voce errore. Ho scoperto che con l'aggiunta di un campo di tipo XML; quindi l'aggiunta di questo nuovo campo per l'istruzione INSERT del SPROC che popola il campo; ho potuto fare un uso migliore della produzione di ELMAH.

Ora vorrei imparare a valori degli elementi di query specifiche all'interno di quel campo XML. Il documento è strutturato come:

<error [...]>
  <serverVariables>
    <item name="ALL_HTTP">
      <value string="..." />
    </item>
    <item name="ALL_RAW">
      <value string="..." />
    </item>
    .
    .
    .
  </serverVariables>
</error>

Ho bisogno di essere in grado di interrogare il valore di elementi specifici sotto.

Così sto guardando un esempio da questo articolo 15seconds.com :

SELECT MyXml.value('(/root/product[@id="304"]/name)[1]', 'nvarchar(30)')

e sto cercando di mappe questi valori per la struttura del mio campo - ma non può. Per es.

select top 10 RealXML.value('(/error/serverVariables[@id="REMOTE_HOST"]/name)[0]', 'nvarchar(30)') 

dove è formattato REMOTE_HOST:

<item name="REMOTE_HOST">
  <value string="55.55.55.55" />
</item>

molto apprezzato

È stato utile?

Soluzione

Questo dovrebbe funzionare:

select top 10 RealXML.value('(/error/serverVariables/item[@name="REMOTE_HOST"]/value/@string)[1]', 'nvarchar(30)') 

Testato utilizzando la seguente:

DECLARE @xml XML  = '
<error>
  <serverVariables>
    <item name="ALL_HTTP">
      <value string="..." />
    </item>
    <item name="ALL_RAW">
      <value string="..." />
    </item>
<item name="REMOTE_HOST">
  <value string="55.55.55.55" />
</item>
  </serverVariables>
</error>
'
SELECT @xml.value('(/error/serverVariables/item[@name="REMOTE_HOST"]/value/@string)[1]','nvarchar(30)') 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top