我有一个来自供应商应用程序的表,它将一些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
答案 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