كيف يمكنني استخدام مساحات الأسماء في استعلام SQL XML مع الأمر "العقد"؟

StackOverflow https://stackoverflow.com/questions/982910

  •  13-09-2019
  •  | 
  •  

سؤال

أحاول الاستعلام عن الحقول من استعلام XML التالي، (وهو مكالمة خدمة ويب حقا):

<soap:Envelope xmlns:xsi="[schema]" xmlns:xsd="[shema]" xmlns:soap="[schema]">
  <soap:Body>
    <RunPackage xmlns="http://tempuri.org/">
      <xmlDoc>
        <Request>
          <SubscriberCode>543253</SubscriberCode>
          <CompanyCode>54325</CompanyCode>
          <BranchName>TestBranchName</BranchName>
          <TempWorksUserName>TempWorksUserName</TempWorksUserName>
[...]

مع استعلام XML التالي:

WITH XMLNAMESPACES('[schema]' AS soap2, DEFAULT '[schema]')

SELECT TransactionID, T2.Loc.query('data(Request/SubscriberCode)') as 'SubscriberCode'
FROM TempWorksRequest
CROSS APPLY RequestXML.nodes('soap2:Envelope/soap2:Body/RunPackage/xmlDoc') as T2(Loc)

يعمل ولكن لا يعيد أي retult!

إذا قمت ببناء نفس الاستعلام ولكن قم بإزالة أشياء مساحة الاسم ثم تعمل. على سبيل المثال، ما يلي يعمل بشكل جيد:

u003CxmlDoc>u003CRequest>u003CSubscriberCode>543253.u003C/SubscriberCode>u003CCompanyCode> 54325.u003C/CompanyCode>u003CBranchName> testbranchname.u003C/BranchName> [...

استعلام SQL:

- حدد مساحة الاسم للصحة حتى نتمكن من استخدام مساحة الاسم الساحلية. مع XMLNamespaces ('[مخطط] "AS SOAP2، الافتراضي" [مخطط] ")

حدد TranceActionID، T2.LOC.Query (البيانات (الطلب / الخضوع) ") ك" Suncructercode "من TempworksRequest Cross Supply Presentxml.Nodes ('xmldoc') as t2 (loc)

أيه أفكار؟

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

المحلول

وجدت القضية شكرا للعلامة! يجب أن يتم الإعلان عن أسماء الأسماء بشكل صريح.

استعلام عمل جديد:

WITH XMLNAMESPACES('[URI1]' AS ns, '[URI2]' AS soap) 

SELECT TransactionID, 
    T2.Loc.query('data(ns:SubscriberCode)') as 'SubscriberCode',
FROM TempWorksRequest
CROSS APPLY RequestXML.nodes('soap:Envelope/soap:Body/ns:RunPackage/ns:xmlDoc/ns:Request') as T2(Loc)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top