سؤال

يستخدم جدول ELMAH_ERROR سهم حقل NTEXT لتخزين إدخال خطأ. لقد وجدت أنه بإضافة حقل من النوع XML ؛ ثم إضافة هذا الحقل الجديد إلى بيان إدراج Sproc الذي يملأ الحقل ؛ يمكنني الاستفادة بشكل أفضل من إخراج Elmah.

الآن أود أن أتعلم كيفية الاستعلام عن قيم العناصر المحددة ضمن حقل XML هذا. المستند منظم على النحو التالي:

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

أحتاج إلى أن أكون قادرًا على الاستعلام عن قيمة عناصر محددة تحتها.

لذلك أنا أنظر إلى مثال من 15Seconds.com مقالة - سلعة:

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

وأنا أحاول تعيين هذه القيم إلى بنية حقل بلدي - لكن لا يمكنني ذلك. على سبيل المثال

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

حيث يتم تنسيق Remote_host:

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

مقدر جدا

هل كانت مفيدة؟

المحلول

هذا يجب أن يعمل:

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

تم اختباره باستخدام ما يلي:

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)') 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top