T-SQL将非结构化XML转换为列

时间:2012-03-18 14:02:54

标签: sql-server tsql

我有一个来自供应商应用程序的表,它将一些xml数据存储到varchar(200)类型的列中。

表格结构和样本数据在这里

declare @table table 
(
 MerchantID int not null
,Data       varchar(200) not null)   

insert into @table  
select 1, '<product><productID>1</productID><pdesc>ProductDesc</pdesc></product>'  
union all
select 2, '<product><itemid>1</itemid><itemname>name of item</itemname></product>'

有没有办法在存储过程中将原始xml数据转换为如下所示的关系格式?

例如,当merchantID通过时为1

MerchantID   productID   pdesc
   1             1       Product Desc

MerchantID传递时,2输出应为

MerchantID  itemid  itemname
   2          1     name of item

1 个答案:

答案 0 :(得分:0)

您可以在SQL Server中使用XPath来访问XML数据节点。

以下是使用您的数据的示例。

declare @test xml
set @test = '<product><productID>1</productID><pdesc>ProductDesc</pdesc></product>'

SELECT  
@test.value('(/product/productID/node())[1]', 'nvarchar(max)') as productID, 
@test.value('(/product/pdesc/node())[1]', 'nvarchar(max)') as pdesc

从那里,你应该能够像这样执行你的工会:

SELECT 1,
xmlfield1.value('(/product/productID/node())[1]', 'int') as id, 
xmlfield1.value('(/product/pdesc/node())[1]', 'nvarchar(max)') as desc

union

SELECT 2, 
xmlfield2.value('/product/itemid/node())[1]', 'int') as id, 
xmlfield2.value('/product/itemname/node())[1]', 'nvarchar(max)') as desc

如果您的数据在同一列中,则可以使用case语句来解析它。

case 
  when merchantId = 1 data.value('(/product/productID/node())[1]', 'int') 
  else data.value('/product/itemid/node())[1]', 'int')
  end as id