Tôi có một bảng chứa một Xml
cột:
SELECT *
FROM Sqm
Một mẫu xml
dữ liệu của một hàng sẽ là:
<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>
Trong trường hợp của dữ liệu này, tôi muốn:
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 ...
Cuối cùng tôi thực sự sẽ được thực hiện SUM()
, MIN()
, MAX()
tập hợp. Nhưng bây giờ tôi chỉ đang cố gắng truy vấn một cột xml.
Trong mã giả, tôi sẽ thử một cái gì đó như:
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
Nhưng truy vấn SQL đó không hoạt động:
Msg 2396, Cấp 16, Trạng thái 1, Dòng 2
XQuery [Sqm.data.query ()]: Thuộc tính có thể không xuất hiện bên ngoài một phần tử
Tôi đã săn lùng, và thật ngạc nhiên là cách truy vấn Xml được ghi chép lại kém tài liệu hoặc được lấy mẫu. Hầu hết các tài nguyên thay vì truy vấn một bảng , hãy truy vấn một biến ; mà tôi không làm. Hầu hết các tài nguyên chỉ sử dụng truy vấn xml để lọc và lựa chọn, thay vì đọc các giá trị. Hầu hết các tài nguyên đọc các nút con được mã hóa cứng (theo chỉ mục), thay vì các giá trị thực tế.
Các tài nguyên liên quan mà tôi đã đọc
- /programming/966441/xml-query-in-sql-server-2008
- Thuộc tính xml truy vấn SQL Server cho một giá trị phần tử
- Thuộc tính XML truy vấn SQL
- SQL Server 2005 XQuery và XML-DML - Phần 1
- BOL: Hỗ trợ XML trong Microsoft SQL Server 2005
- Truy vấn XML trong SQL Server
- Truy vấn XML SQL Server cơ bản
- BOL: phương thức query () (Kiểu dữ liệu xml)
- Hội thảo XML V - Đọc giá trị từ các cột XML
- SQL SERVER - Giới thiệu về Khám phá các Phương thức Kiểu Dữ liệu XML - Một Primer
Cập nhật: .value thay vì .query
Tôi đã thử sử dụng ngẫu nhiên .value
, thay cho .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
Nhưng điều đó cũng không hoạt động:
Msg 2389, Mức 16, Trạng thái 1, Dòng 3 XQuery [Sqm.data.value ()]:
'value ()' yêu cầu một singleton (hoặc chuỗi trống), toán hạng tìm thấy thuộc loại 'xdt: untypedAtomic *'
select m.*
nhìn thấy bảng trung gian bí mật, ma thuật mà nó đã xây dựng. Cú pháp để truy vấn giá trị của một phần tử là gì? ví dụ như giá trị của<Metric>8675309</Metric>
là "8675309"