簡體   English   中英

MS SQL 2005表到XML

[英]MS SQL 2005 Table to XML

我在SQL Server 2005中有一個簡單的表,我希望將其轉換為XML(使用“FOR XML”子句)。 我無法讓我的XML看起來像所需的輸出。

我試過在網上瀏覽各種教程,但我很掙扎。 有人可以幫忙嗎?

我的表看起來像這樣

TYPE,GROUP,VALUE
Books,Hardback,56
Books,Softcover,34
CDs,Singles,45
CDS,Multis,78

我需要的輸出樣式是:

<data>
  <variable name="TYPE">
   <row>
     <column>GROUP</column>
     <column>VALUE</column>
   </row>
   <row>
     <column>GROUP</column>
     <column>VALUE</column>
   </row>
  </variable>
 <variable name="TYPE">
   <row>
     <column>GROUP</column>
     <column>VALUE</column>
   </row>
   <row>
     <column>GROUP</column>
     <column>VALUE</column>
   </row>
  </variable>
</data>

編輯:據我所知,我需要多個值。 我正在生成用於Xcelsius的XML鏈接XML和Xcelsius ),因此無法控制XML的格式。 我可以根據鏈接教程使用ASP生成XML,但我希望從SQL Server直接獲取它。

編輯2:我希望有一些優雅和整潔的東西......但是Godeke的榜樣最接近。 一些擺弄SQL,我想出了:

select
   "type" as '@name', 
   "group" as 'row/column',
   null as 'row/tmp', 
   "value" as 'row/column'
from tableName
for xml path('variable'), root('data')

輸出幾乎與我想要的完全相同。 null / tmp行甚至不輸出; 它只是阻止連接。 仍然標簽<variable name="TYPE">為每一行重復,這是我不能擁有的。

盡我所能,這是:

select "type" as '@name', "group" as 'row/column1', "value" as 'row/column2'
from tableName
for xml path('variable'), root('data')

命名兩個相同的項(“列”和“列”)並不是我知道如何在一次傳遞中做的事情,但另一方面它是一個奇怪的XML模式選擇; 如果元素包含不同的數據,則它們具有唯一的名稱 顯而易見的選擇(將它們命名為'row / column')只是將它們在輸出中連接成一個值。

另請注意,每個返回的行將是一個與其他行不同的“變量”元素。 要獲得沒有冗余記錄的嵌套,需要子查詢:

select distinct "type" as '@name'
from Agent
for xml path('variable'), root('data')

是我的第一個想法,但明顯阻止嵌套。

所有這些讓我覺得要獲得你需要的確切輸出,你可能必須使用EXPLICIT模式。 也許我的問題是這樣的東西,我在平台上使用DOMDocument :)。

我更喜歡使用XML PATH,它提供了一種更好的方法來控制你的元素等。

看到

但這非常棘手

 /*
create table #tablename
(
[type] varchar(20),
[group] varchar(20),
[value] varchar(20)
)

insert into #tablename select 'type1','group11','value111'
insert into #tablename select 'type1','group11','value112'
insert into #tablename select 'type1','group12','value121'
insert into #tablename select 'type1','group12','value122'
insert into #tablename select 'type2','group21','value211'
insert into #tablename select 'type2','group21','value212'
insert into #tablename select 'type2','group22','value221'
insert into #tablename select 'type2','group22','value222'

alter table #tablename add id uniqueidentifier

update #tablename set id = newid()
*/

select [type] as '@name',
    (select     
        (select [column] from
            (
                select [group] as 'column', tbn1.type, tbn2.[group]
               from #tablename tbn3 WHERE tbn3.type = tbn1.type and tbn2.[group] =  tbn3.[group]
               union
         select [value], tbn1.type, tbn2.[group]
              from #tablename tbn3 WHERE tbn3.type = tbn1.type and tbn2.[group] = tbn3.[group]
            ) as s
        for xml path(''),type 
        )
    from #tablename tbn2 
    where tbn2.type = tbn1.type
    for xml path('row3'), type
)

from #tableName tbn1 
GROUP BY [type]
for xml path('variable'), root('data') 

給你我要求的東西,但優雅和整潔不是。

下面的腳本生成所需的格式


<DATA>
<VARIABLE TYPE =“Books”>
<row TYPE =“Books”>
<GROUP>精裝</ GROUP>
<值> 56 </ VALUE>
</行>
<row TYPE =“Books”>
<GROUP>簡裝</ GROUP>
<值> 34 </ VALUE>
</行>
</ VARIABLE>
<VARIABLE TYPE =“CDs”>
<row TYPE =“CDs”>
<GROUP>單曲</ GROUP>
<值> 45 </ VALUE>
</行>
<row TYPE =“CDS”>
<GROUP>復合音色</ GROUP>
<值> 78 </ VALUE>
</行>
</ VARIABLE>
</ DATA>

調用


DECLARE @tblItems table (
[TYPE] varchar(50)
,[GROUP] varchar(50)
,[VALUE] int
)

DECLARE @tblShredded table (
[TYPE] varchar(50)
,[XmlItem] xml
)

DECLARE @xmlGroupValueTuples xml

insert into @tblItems([TYPE],[GROUP],[VALUE]) values( 'Books','Hardback',56)
insert into @tblItems([TYPE],[GROUP],[VALUE]) values( 'Books','Softcover',34)
insert into @tblItems([TYPE],[GROUP],[VALUE]) values( 'CDs','Singles',45)
insert into @tblItems([TYPE],[GROUP],[VALUE]) values( 'CDS','Multis',78)

SET @xmlGroupValueTuples =
(
SELECT
"@TYPE" = [TYPE]
,[GROUP]
,[VALUE]
FROM @tblItems
FOR XML PATH('row'), root('Root')
)

INSERT @tblShredded([TYPE], XmlItem)
SELECT
[TYPE] = XmlItem.value('./row[1]/@TYPE', 'varchar(50)')
,XmlItem
FROM dbo.tvfShredGetOneColumnedTableOfXmlItems(@xmlGroupValueTuples)


SELECT
(
SELECT
VARIABLE =
(
SELECT
"@TYPE" = t.[TYPE]

,(
SELECT
tInner.XmlItem.query('./child::*')
FROM @tblShredded tInner
WHERE tInner.[TYPE] = t.[TYPE]
FOR XML PATH(''), ELEMENTS, type
)
FOR XML PATH('VARIABLE'),type
)
)
FROM @tblShredded t
GROUP BY
t.[TYPE]
FOR XML PATH(''), ROOT('DATA')

哪里


-- Example Inputs
/*
DECLARE @xmlListFormat xml
SET @xmlListFormat =
'
<XmlListRoot>
<Item>004421UB7</Item>
<Item>59020UH24</Item>
<Item>542514NA8</Item>
</XmlListRoot>
'
*/

-- =============================================
-- Author: 6eorge Jetson
-- Create date: 01/22/3003
-- Description: Shreds an input XML list conforming to the expected list schema
-- =============================================
CREATE FUNCTION [dbo].[tvfShredGetOneColumnedTableOfXmlItems] (@xmlListFormat xml)
RETURNS
@tblResults TABLE (XmlItem xml)
AS
BEGIN

INSERT @tblResults
SELECT
tblShredded.colXmlItem.query('.') as XmlItem
FROM
@xmlListFormat.nodes('/child::*/child::*') as tblShredded(colXmlItem)

RETURN
END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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