我有兩個與Id列相關的表(使用表變量進行說明,您可以直接在management studio中運行這些表)。將sql表中的xml字符串轉換爲動態列
第一個表中的項目具有一些標準的列集,第二個表具有一些用於相同記錄的擴展參數數據。我將擴展集存儲爲xml,因爲它在所有方面都是動態的(不同的每個產品或新的值被添加等)。
我可以連接這兩個表格並將列列表展平,如下面的示例中所示。但我的查詢需要事先定義動態列。我想這是真正的動態,因爲如果我要在@extended表中添加一個新列,它應該會自動作爲輸出列列表中的新列出現。
基本上,附加列的列表應該由該記錄的xml確定。列名應該是xml標記,值應該是每個id的xml標記的值。
任何指針? (並且可以在快速過與100k左右或者更多的記錄在每個表)
declare @standard table
(
Id INT,
Column1 varchar(10),
Column2 varchar(10),
Column3 varchar(10)
)
declare @extended table
(
Id INT,
column1 xml
)
insert into @standard values (1,'11', '12', '13')
insert into @standard values (2,'21', '22', '23')
insert into @extended values (1,'<FieldSet><Field><id>1</id><column4>1x</column4><column5>4x</column5></Field></FieldSet>')
insert into @extended values (2,'<FieldSet><Field><id>2</id><column4>2x</column4><column5>5x</column5></Field></FieldSet>')
select s.column1, s.column2,
(
SELECT Item2.value('(column4)[1]', 'varchar(50)')
FROM
e.column1.nodes('/FieldSet') AS T(Item)
CROSS APPLY e.column1.nodes('/FieldSet/Field') AS T2(Item2)
) column4,
(
SELECT Item2.value('(column5)[1]', 'varchar(50)')
FROM
e.column1.nodes('/FieldSet') AS T(Item)
CROSS APPLY e.column1.nodes('/FieldSet/Field') AS T2(Item2)
) column5
from @extended e
join @standard s on s.Id = e.Id
我看到你說的話。但是這是一個巨大系統中非常小的部分,你需要在特定的實體上存儲一些屬性。這些屬性(名稱值對)爲每個產品的實體動態添加,並且在產品之間有所不同。這個實體是我的例子中的標準表,擴展的是屬性。接下來有什麼其他的選擇來處理這種情況。我可能有一個有點複雜的3或4表組,並處理這個,但這似乎更簡單。 –
當然,馬克刪除了他的評論,所以我的評論是一個孤兒。無論如何,這個「http://en.wikipedia.org/wiki/Entity-attribute-value_model」是我所追求的。 XML確實是一種替代方案,但現在,我將使用常規EAV表。 –