[英]SQL Query to XML with tag attributes
這里有張桌子:
CREATE TABLE temp
(ID int, name varchar(50));
INSERT INTO temp
([ID], [name])
VALUES
(1, 'Value 1'),
(2, 'Value 2');
需要 SQL 查詢返回以下結果:
<root>
<row>
<param name="first">1</param>
<param name="second">Value 1</param>
</row>
<row>
<param name="first">2</param>
<param name="second">Value 2</param>
</row>
</root>
估計查詢是:
SELECT
[ID] as [param/@name['first']],
[name] as [param/@name['second']]
FROM
temp
for xml path('row'), root('root')
請更正查詢以使其正常工作。
XQuery FLWOR表達式使您可以完全控制 XML 的形狀。 一探究竟:
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT PRIMARY KEY, [name] varchar(50));
INSERT INTO @tbl (id, [name])
VALUES (1, 'Value 1')
, (2, 'Value 2');
-- DDL and sample data population, end
;WITH rs(xml_data) AS
(
SELECT *
FROM @tbl
FOR XML PATH('row'), TYPE, ROOT('root')
)
SELECT xml_data.query('<root>
{
for $r in /root/row
return
<row>
<param name="first">{data($r/id/text())}</param>
<param name="second">{data($r/name/text())}</param>
</row>
}
</root>') AS xml_output
FROM rs;
Output
<root>
<row>
<param name="first">1</param>
<param name="second">Value 1</param>
</row>
<row>
<param name="first">2</param>
<param name="second">Value 2</param>
</row>
</root>
最簡單的方法可能是這樣的:
SELECT 'first' as [param/@name]
,ID as [param]
,''
,'second' as [param/@name]
,[name] as [param]
FROM temp t
FOR XML PATH('row'), root('root');
簡而言之:
引擎在列下工作並找到
<root>
<row>
<param>
,我們必須打開它。@name
。ID
) 也存在於<param>
中,它仍然是打開的。 將其添加為text()
節點。<param>
... 好的,下一欄看起來更好。 有一個元素<param>
...好的,最后一個關閉了,我們要打開一個新的!
等等...
這也適用於路徑片段:
SELECT 'first' as [param/onemore/@name]
,ID as [param/onemore]
,'' AS [param]
,'second' as [param/onemore/@name]
,[name] as [param/onemore]
FROM temp t
FOR XML PATH('row'), root('root');
結果
<root>
<row>
<param>
<onemore name="first">1</onemore>
<onemore name="second">Value 1</onemore>
</param>
</row>
<row>
<param>
<onemore name="first">2</onemore>
<onemore name="second">Value 2</onemore>
</param>
</row>
</root>
在這種情況下,我們重新打開<onemore>
,但我們留在打開的<param>
內。
您可以通過子查詢實現此目的:
SELECT 'first' as [param/@name],
ID as [param],
(SELECT 'second' as [param/@name],
name as [param]
FROM temp t1 WHERE t1.ID = t.ID
FOR XML PATH(''), TYPE )
FROM temp t
FOR XML PATH('row'), root('root')
Output:
<root>
<row>
<param name="first">1</param>
<param name="second">Value 1</param>
</row>
<row>
<param name="first">2</param>
<param name="second">Value 2</param>
</row>
</root>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.