كيف يمكنني استخدام مساحات الأسماء في استعلام SQL XML مع الأمر "العقد"؟
-
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)