2012-03-18 7 views
1

XMLデータをvarchar(200)の列に格納するベンダーアプリケーションのテーブルがあります。構造化されていないXMLを列に変換する

表構造とサンプルデータはこちら

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パスは2出力は

MerchantID itemid itemname 
    2   1  name of item 
+0

これがそう手順は –

答えて

0

あなたはXMLデータノードにアクセスするためにSQL ServerでXPathを使用することができますする必要がありますときに例えばため

merchantIDが渡さ1

MerchantID productID pdesc 
    1    1  Product Desc 

です。

ここでは、データを使用した例を示します。そこから

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 
+0

XMLがmerchantid 3のために、それはハードコーディングXML要素 –

+0

@SQLLearnerせずに変換するための簡単な方法異なっている生と非構造化されたXMLから列を返す必要が保存されたレポートのためである - があるかもしれません要素名をハードコーディングせずに動的に行う方法ですが、いくつかの研究が必要です。 –

関連する問題