簡體   English   中英

SQL 使用標簽屬性查詢 XML

[英]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> ,我們必須打開它。
  • 現在必須將值(“first”)寫為屬性@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM