2010-07-13 29 views
9

Đơn giản hóa những gì tôi đang làm hơi, làm ví dụ, nói rằng tôi có các bảng sau:Làm cách nào để sử dụng giá trị cột làm tên phần tử xml sử dụng cho xml trong SQL Server 2005?

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) 

mà chỉ đơn giản định nghĩa một bảng tên nguyên tố đó có thể là năng động, chống lại được định nghĩa một bảng các giá trị.

Điều tôi muốn là tạo XML dưới dạng sau, trong đó các giá trị của bảng @elements trở thành tên phần tử và giá trị của bảng @values ​​trở thành giá trị.

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

Tuy nhiên những nỗ lực của tôi với for xml cho đến nay không được suông sẻ:

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

lợi nhuận

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

for xml auto lợi nhuận

<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 trả về

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

Có cách nào tôi có thể lấy giá trị từ cột này sang đầu ra dưới dạng tên phần tử không? Tôi chắc rằng tôi đang thiếu một cái gì đó rõ ràng là đơn giản ở đây.

+0

Tôi không nghĩ bạn có thể làm điều đó. Bạn có thể làm rất nhiều với các lệnh FOR XML khác nhau - nhưng trong mọi trường hợp, các tên của các phần tử XML và/hoặc các thuộc tính kết quả cần phải được cố định, ví dụ: được bạn nhập vào. Tôi không biết bất kỳ cách nào để đưa chúng ra khỏi một bảng và được gán động –

Trả lời

11

Đó là cheezy nhưng nó hoạt động ...

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

--- các kết quả ---

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

Xin lỗi vì sự chậm trễ lâu dài (3 năm!) Có, điều này không có tác dụng. trên ý kiến ​​cũng rằng EAV không phải là cách tiếp cận đúng anyway, nhưng điều này không công việc.Tôi đã quên mất những gì tôi thực sự đã làm.Nó có thể đã được một chút XSL hoặc mã khách hàng để dịch các XML vào định dạng tôi cần thiết – tjmoore

+0

@tjmoore vì vậy làm thế nào bạn đã kết thúc thay đổi mô hình của bạn để có được xml tùy chỉnh? – vittore

+0

Nếu giá trị chứa ví dụ '&' không thành công. Vì vậy, không có điều này không làm việc trong trường hợp chung. Thử nghiệm với điều này để xem thất bại chọn đúc (' barnes & cao quý' dưới dạng xml) – Konstantin

7

Bạn đang cố gắng mô hình hóa cơ sở dữ liệu ngữ nghĩa đáng sợ (Entity-Attribute-Value). Đọc bài viết này để ít nhất giúp bạn bắt đầu trên con đường đúng đắn: Best Practices for Semantic Data Modeling for Performance and Scalability

Về mặt kỹ thuật, đây là truy vấn mà bạn đang tìm kiếm:

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

Ý tưởng hay - nhưng một lần nữa: bạn cần xác định rõ ràng và thủ công các cột trong lệnh PIVOT - không có đọc các cột đó từ '@elements 'bảng và sử dụng chúng, phải không? –

+3

@Marc: đúng. Nhưng đó là toàn bộ ý tưởng về lý do tại sao mô hình EAV là một ý tưởng tồi để bắt đầu. SQL là một hệ thống quan hệ, trong đó các bảng có các cột. Vì vậy, lưu trữ cột dưới dạng cột và bạn sẽ không có 'vấn đề' này để bắt đầu;) –

+0

@Renus: đồng ý hoàn toàn! EAV là lộn xộn và xấu xa - và vẫn không may sử dụng rộng rãi :-( –

Các vấn đề liên quan