У мене є таблиця, яка містить 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 не працює:
Повідомлення 2396, рівень 16, стан 1, рядок 2
XQuery [Sqm.data.query ()]: Атрибут може не відображатися поза елементом
Я полював, і дивно, наскільки погано задокументований, або прикладний, запит Xml. Більшість ресурсів замість запиту таблиці , запитують змінну ; що я не роблю. Більшість ресурсів використовують лише запити xml для фільтрації та вибору, а не для читання значень. Більшість ресурсів читають жорстко закодовані дочірні вузли (за індексом), а не фактичні значення.
Пов’язані ресурси, які я читав
- /programming/966441/xml-query-in-sql-server-2008
- Атрибут xml запиту SQL Server для значення елемента
- SQL запит атрибутів XML
- SQL Server 2005 XQuery та XML-DML - Частина 1
- BOL: Підтримка XML у Microsoft SQL Server 2005
- Запит XML у SQL Server
- Основні запити XML SQL Server
- BOL: метод query () (тип даних xml)
- XML Workshop V - Зчитування значень зі стовпців XML
- SQL SERVER - Вступ до виявлення методів типу даних XML - Посібник
Оновлення: .value, а не .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
Але це також не працює:
Повідомлення 2389, рівень 16, стан 1, рядок 3 XQuery [Sqm.data.value ()]:
'value ()' вимагає синглтон (або порожню послідовність), знайдений операнд типу 'xdt: untypedAtomic *'
select m.*
побачити секретний, чарівний, проміжний стіл, який він побудував. Який синтаксис запиту значення елемента? наприклад , значення<Metric>8675309</Metric>
є «8675309»