2010-07-13 26 views
9

簡化我在幹什麼一些,作爲一個例子,說我有如下表:如何在SQL Server 2005中使用列值作爲xml元素名稱?

declare @elements table (id int, name nvarchar(20)) 

insert into @elements (id, name) values (1, 'FirstName') 
insert into @elements (id, name) values (2, 'Surname') 
insert into @elements (id, name) values (3, 'Address') 

declare @values table (id int, value nvarchar(20), elementId int) 

insert into @values (id, value, elementId) values (1, 'XXX', 1) 
insert into @values (id, value, elementId) values (2, 'YYY', 2) 
insert into @values (id, value, elementId) values (3, 'ZZZ', 3) 

這只是定義可以是動態的,針對其定義值表元素名稱的表格。

我想要的是以下面的形式生成XML,其中@elements表的值成爲元素名稱,並且@values表的值成爲值。

<Customer> 
    <FirstName>XXX</FirstName> 
    <Surname>YYY</Surname> 
    <Address>ZZZ<Address> 
</Customer> 

但是我有for xml努力至今都不會那麼好:

select e.name, v.value from @elements e 
inner join @values v on v.elementId = e.id 
for xml path(''), root('customer') 

回報

<customer> 
    <name>FirstName</name> 
    <value>XXX</value> 
    <name>Surname</name> 
    <value>YYY</value> 
    <name>Address</name> 
    <value>ZZZ</value> 
</customer> 

for xml auto回報

<customer> 
    <e name="FirstName"> 
    <v value="XXX" /> 
    </e> 
    <e name="Surname"> 
    <v value="YYY" /> 
    </e> 
    <e name="Address"> 
    <v value="ZZZ" /> 
    </e> 
</customer> 

for xml raw返回

​​

有沒有一種方法,我可以從列中獲取值作爲元素名稱輸出?我確定我在這裏錯過了一些顯然很簡單的事情。

+0

我不認爲你可以做到這一點。您可以使用各種FOR XML命令做很多事情 - 但是在任何情況下,生成的XML元素和/或屬性的名稱都需要固定,例如,由您鍵入。我不知道有什麼方法可以將這些從表格中拉出來並動態分配 – 2010-07-13 19:09:08

回答

11

這是cheezy但它的作品...

select 
    cast('<' + name + '>' + value + '</' + name + '>' as xml) 
from @values v 
join @elements e on v.id = e.id  
for xml path(''), root('Customer') 

---結果---

<Customer> 
    <FirstName>XXX</FirstName> 
    <Surname>YYY</Surname> 
    <Address>ZZZ</Address> 
</Customer> 
+0

對不起,很長的延遲(3年!)是的,這是行得通的,Cheezy也許,但是工作。上面的評論也表明EAV並不是正確的方法,但是這是做這項工作的,我早已忘記了我的實際做法,它可能是一些XSL或客戶端代碼來將XML轉換成我所需要的格式 – tjmoore 2014-07-25 16:27:09

+0

@tjmoore所以你怎麼最終改變你的模型,以獲得自定義XML? – vittore 2015-03-10 16:49:19

+0

如果值包含例如'&',則失敗。所以在一般情況下這不起作用。用此測試來查看失敗選擇投射(' barnes&noble'爲xml) – Konstantin 2016-08-26 07:27:23

7

您試圖對可怕的語義數據庫(Entity-Attribute-Value)建模。閱讀本文至少讓你開始在正確的道路上:Best Practices for Semantic Data Modeling for Performance and Scalability

從技術上說,這是你要找的查詢:

select * from (
select name, value 
from @values v 
join @elements e on v.id = e.id) ve 
pivot (max(value) 
for name in ([FirstName], [Surname], [Address])) as p 
for xml path('Customer') 
+0

好主意 - 但同樣的:您需要在PIVOT命令中明確和手動指定列 - 不會讀取來自'@elements桌子和使用它們,對吧? – 2010-07-13 19:13:53

+3

@馬克:對。但這就是爲什麼EAV模型從一開始就是一個糟糕的主意的整個想法。 SQL是一個關係系統,表中有列。因此,將列存儲爲列,並且不會出現此問題;) – 2010-07-13 19:19:34

+0

@Renus:完全同意! EAV是混亂和邪惡的 - 仍然不幸被廣泛使用:-( – 2010-07-13 19:23:09

相關問題