मेरे पास एक तालिका है जिसमें एक Xml
कॉलम है:
SELECT *
FROM Sqm
एक xml
पंक्ति के डेटा का एक नमूना होगा:
<Sqm version="1.2">
<Metrics>
<Metric id="TransactionCleanupThread.RecordUsedTransactionShift" type="timer" unit="µs" count="1" sum="21490" average="21490" minValue="73701" maxValue="73701" >73701</Metric>
<Metric id="TransactionCleanupThread.RefundOldTrans" type="timer" unit="µs" count="1" sum="184487" average="184487" minValue="632704" maxValue="632704" >632704</Metric>
<Metric id="Database.CreateConnection_SaveContextUserGUID" type="timer" unit="µs" count="2" sum="7562" average="3781" minValue="12928" maxValue="13006" standardDeviation="16" >12967</Metric>
<Metric id="Global.CurrentUser" type="timer" unit="µs" count="6" sum="4022464" average="670411" minValue="15" maxValue="13794345" standardDeviation="1642047">2299194</Metric>
<Metric id="Global.CurrentUser_FetchIdentityFromDatabase" type="timer" unit="µs" count="1" sum="4010057" average="4010057" minValue="13752614" maxValue="13752614" >13752614</Metric>
</Metrics>
</Sqm>
इस डेटा के मामले में, मैं चाहूंगा:
SqmId id type unit count sum minValue maxValue standardDeviation Value
===== =================================================== ===== ==== ===== ====== ======== ======== ================= ======
1 TransactionCleanupThread.RecordUsedTransactionShift timer µs 1 21490 73701 73701 NULL 73701
1 TransactionCleanupThread.RefundOldTrans timer µs 1 184487 632704 632704 NULL 632704
1 Database.CreateConnection_SaveContextUserGUID timer µs 2 7562 12928 13006 16 12967
1 Global.CurrentUser timer µs 6 4022464 15 13794345 1642047 2299194
1 Global.CurrentUser_FetchIdentityFromDatabase timer µs 1 4010057 13752614 13752614 NULL 13752614
2 ...
अंत में मैं वास्तव में प्रदर्शन किया जाएगा SUM()
, MIN()
, MAX()
एकत्रीकरण। लेकिन अभी के लिए मैं सिर्फ एक xml कॉलम को क्वेरी करने की कोशिश कर रहा हूं ।
छद्म कोड में, मैं कुछ इस तरह की कोशिश करेंगे:
SELECT
SqmId,
Data.query('/Sqm/Metrics/Metric/@id') AS id,
Data.query('/Sqm/Metrics/Metric/@type') AS type,
Data.query('/Sqm/Metrics/Metric/@unit') AS unit,
Data.query('/Sqm/Metrics/Metric/@sum') AS sum,
Data.query('/Sqm/Metrics/Metric/@count') AS count,
Data.query('/Sqm/Metrics/Metric/@minValue') AS minValue,
Data.query('/Sqm/Metrics/Metric/@maxValue') AS maxValue,
Data.query('/Sqm/Metrics/Metric/@standardDeviation') AS standardDeviation,
Data.query('/Sqm/Metrics/Metric') AS value
FROM Sqm
लेकिन वह SQL क्वेरी काम नहीं करती है:
Msg 2396, स्तर 16, राज्य 1, पंक्ति 2
XQuery [Sqm.data.query ()]: गुण एक तत्व के बाहर प्रकट नहीं हो सकता है
मैंने शिकार किया है, और यह आश्चर्यजनक है कि खराब तरीके से प्रलेखित, या जांच की गई, एक्सएमएल क्वेरी क्या है। तालिका को क्वेरी करने के बजाय अधिकांश संसाधन , एक चर क्वेरी ; जो मैं नहीं कर रहा हूं। अधिकांश संसाधन केवल पढ़ने के मूल्यों के बजाय फ़िल्टरिंग और चयन के लिए xml क्वेरी का उपयोग करते हैं। अधिकांश संसाधन वास्तविक मानों के बजाय हार्ड-कोडेड चाइल्ड नोड्स (इंडेक्स द्वारा) पढ़ते हैं।
संबंधित संसाधन जो मैंने पढ़ा
- /programming/966441/xml-query-in-sql-server-2008
- तत्व मान के लिए SQL सर्वर क्वेरी xml विशेषता
- SQL क्वेरी XML विशेषताएँ
- SQL सर्वर 2005 XQuery और XML-DML - भाग 1
- BOL: Microsoft SQL Server 2005 में XML समर्थन
- SQL सर्वर में XML को छोड़कर
- बेसिक SQL सर्वर XML क्वेरी
- BOL: क्वेरी () विधि (xml डेटा प्रकार)
- एक्सएमएल वर्कशॉप वी - एक्सएमएल कॉलम से रीडिंग वैल्यू
- एसक्यूएल सर्वर - एक्सएमएल डेटा टाइप मेथड्स की खोज - एक प्राइमर
अद्यतन: .query के बजाय
मैंने इसके .value
स्थान पर बेतरतीब ढंग से उपयोग करने की कोशिश की .query
:
SELECT
Sqm.SqmId,
Data.value('/Sqm/Metrics/Metric/@id', 'varchar(max)') AS id,
Data.value('/Sqm/Metrics/Metric/@type', 'varchar(max)') AS type,
Data.value('/Sqm/Metrics/Metric/@unit', 'varchar(max)') AS unit,
Data.value('/Sqm/Metrics/Metric/@sum', 'varchar(max)') AS sum,
Data.value('/Sqm/Metrics/Metric/@count', 'varchar(max)') AS count,
Data.value('/Sqm/Metrics/Metric/@minValue', 'varchar(max)') AS minValue,
Data.value('/Sqm/Metrics/Metric/@maxValue', 'varchar(max)') AS maxValue,
Data.value('/Sqm/Metrics/Metric/@standardDeviation', 'varchar(max)') AS standardDeviation,
Data.value('/Sqm/Metrics/Metric', 'varchar(max)') AS value
FROM Sqm
लेकिन वह भी काम नहीं करता है:
Msg 2389, लेवल 16, स्टेट 1, लाइन 3 XQuery [Sqm.data.value ()]:
'value ()' के लिए एक सिंगलटन (या खाली अनुक्रम) की आवश्यकता होती है, जो टाइप 'xdt: untypedtomic *' का ऑपरेंड पाया जाता है।
select m.*
इसके द्वारा बनाई गई गुप्त, जादुई, मध्यवर्ती तालिका को देखने का कोई तरीका नहीं है । किसी तत्व के मूल्य के लिए वाक्य रचना क्या है? उदाहरण के लिए "8675309" का मान<Metric>8675309</Metric>
है