T-SQL преобразует неструктурированный XML в столбцы - PullRequest
1 голос
/ 18 марта 2012

У меня есть таблица из приложения поставщика, которая хранит некоторые данные 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 pass равно 2, вывод должен быть

MerchantID  itemid  itemname
   2          1     name of item

1 Ответ

0 голосов
/ 18 марта 2012

Вы можете использовать XPath в SQL Server для доступа к узлам данных 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...