我在一個欄位中有一些 XML 內容;我想將每個 xml 欄位拆分為多行。
XML 是這樣的:
<env>
<id>id1<\id>
<DailyProperties>
<date>01/01/2022<\date>
<value>1<\value>
<\DailyProperties>
<DailyProperties>
<date>05/05/2022<\date>
<value>2<\value>
<\DailyProperties>
<\env>
我想將所有內容放在表格中:
ID DATE VALUE
id1 01/01/2022 1
id1 05/05/2022 2
現在我設法決議了 xml 值,并且我在網上找到了一些東西可以將一個字串分成多行(像這樣),但是我的字串應該有某種分隔符。我這樣做了:
SELECT
ID,
XMLDATA.X.query('/env/DailyProperties/date').value('.', 'varchar(100)') as r_date,
XMLDATA.X.query('/env/DailyProperties/value').value('.', 'varchar(100)') as r_value
from tableX
outer apply xmlData.nodes('.') as XMLDATA(X)
WHERE ID = 'id1'
但我得到的所有值都沒有分隔符,因此:
01/10/202202/10/202203/10/202204/10/202205/10/202206/10/202207/10/202208/10/202209/10/202210/10/2022
或者,如我的示例所示:
ID R_DATE R_VALUE
id01 01/01/202205/05/2022 12
我發現 XQuery 有一個last()回傳最后決議值的函式;在我的 xml 示例中,它將僅回傳05/05/2022,因此它應該存在一些用于解決添加定界符的問題。行數可能會有所不同,因為它可能會改變我具有值的天數。
uj5u.com熱心網友回復:
請嘗試以下解決方案。
我必須修復您的 XML 以使其格式正確。
資料庫
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<env>
<id>id1</id>
<DailyProperties>
<date>01/01/2022</date>
<value>1</value>
</DailyProperties>
<DailyProperties>
<date>05/05/2022</date>
<value>2</value>
</DailyProperties>
</env>');
SELECT p.value('(id/text())[1]','VARCHAR(20)') AS id
, c.value('(date/text())[1]','VARCHAR(10)') AS [date]
, c.value('(value/text())[1]','INT') AS [value]
FROM @tbl
CROSS APPLY xmldata.nodes('/env') AS t1(p)
OUTER APPLY t1.p.nodes('DailyProperties') AS t2(c);
輸出
| ID | 日期 | 價值 |
|---|---|---|
| id1 | 01/01/2022 | 1個 |
| id1 | 05/05/2022 | 2個 |
uj5u.com熱心網友回復:
Yitzhak 領先我 2 分鐘。盡管如此,這就是我所擁有的:
--==== XML Data:
DECLARE @xml XML =
'<env>
<id>id1</id>
<DailyProperties>
<date>01/01/2022</date>
<value>1</value>
</DailyProperties>
<DailyProperties>
<date>05/05/2022</date>
<value>2</value>
</DailyProperties>
</env>';
--==== Solution:
SELECT
ID = ff2.xx.value('(text())[1]','varchar(20)'),
[Date] = ff.xx.value('(date/text())[1]', 'date'),
[Value] = ff.xx.value('(value/text())[1]', 'int')
FROM (VALUES(@xml)) AS f(X)
CROSS APPLY f.X.nodes('env/DailyProperties') AS ff(xx)
CROSS APPLY f.X.nodes('env/id') AS ff2(xx);
退貨:
ID Date Value
-------------------- ---------- -----------
id1 2022-01-01 1
id1 2022-05-05 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/537288.html
標籤:sql服务器数据库表查询
