XMLデータをテーブルに細断します
-
17-09-2020 - |
質問
私は、ソース内のさまざまな要素を自分のテーブルにマッピングすることによって、複数のプロバイダから複数のプロバイダから複数のXMLデータセットをShredしなければなりません。トップレベルの情報を収集しているときは、これを元気にすることができますが、私の情報の一部はカテゴリなどのコレクションにあります。私の最初のステップは、データをXMLから引き出すためだけにそれをいくつかのテーブルに入れてから、次のステップは私の実際のテーブルにデータをマージすることです。
マイXMLデータは次のようになります。
<ArrayOfApiNewItemDetailInfo>
<ApiNewItemDetailInfo>
<categories>
<ApiNavCategoryInfo>
<count></count>
<id></id>
<name></name>
<selected></selected>
</ApiNavCategoryInfo>
<ApiNavCategoryInfo>
<count></count>
<id></id>
<name></name>
<selected></selected>
</ApiNavCategoryInfo>
</categories>
<item_id></item_id>
<product_id></product_id>
</ApiNewItemDetailInfo>
<ArrayOfApiNewItemDetailInfo>
.
複数のカテゴリを単一の製品に割り当てることができる場合は、製品ID、項目ID、カテゴリIDのテーブルにこのデータを細断したい場合
最初に、私は私のデータディクショリテーブル
を持っていますCREATE TABLE [dbo].[DataDictionary](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Provider] [varchar](50) NOT NULL,
[XmlColumn] [varchar](100) NOT NULL,
[Datatype] [varchar](100) NOT NULL,
[DestinationColumn] [varchar](100) NOT NULL
)
.
この表では、これらのレコードがあります。
88 Categories product_id int ProviderProductId
89 Categories item_id int ItemId
93 Categories categories/ApiNavCategoryInfo/id int CategoryId
.
今、私は私のプロバイダのデータディクショナリを引くSQL文を持っていて、データをテーブルに細断します。
CREATE TABLE #SQLWork (Row_Id INT IDENTITY,SQL varchar(500))
INSERT #SQLWork (SQL) VALUES ('DROP TABLE TempCategories')
INSERT #SQLWork (SQL) VALUES ('SELECT ')
INSERT #SQLWork (SQL) SELECT 'Categories.value(''' + XmlColumn + '[1]''' + ',''' + Datatype + ''') as ' + DestinationColumn + ', '
FROM DataDictionary WHERE UPPER(Provider) = 'CATEGORIES'
UPDATE #SQLWork SET SQL = REPLACE(SQL,', ','') WHERE row_id = @@IDENTITY
INSERT #SQLWork (SQL) VALUES (' INTO TempCategories ')
INSERT #SQLWork (SQL) VALUES (' FROM RawDetails CROSS APPLY Data.nodes(''' + '//ArrayOfApiNewItemDetailInfo/ApiNewItemDetailInfo' + ''') as NewTable(Categories)')
DECLARE @SQL nvarchar(max)
select @SQL = coalesce(@SQL + ' ',' ') + Sql from #SQLWork Order By Row_Id
--SELECT @SQL
exec sp_executesql @sql
drop table #Sqlwork
.
生成されたSQL文は次のようになります。
DROP TABLE TempCategories
SELECT
Categories.value('product_id[1]','int') as ProviderProductId,
Categories.value('item_id[1]','int') as ItemId,
Categories.value('categories/ApiNavCategoryInfo/id[1]','int') as CategoryId
INTO
TempCategories
FROM
RawDetails
CROSS APPLY
Data.nodes('//ArrayOfApiNewItemDetailInfo/ApiNewItemDetailInfo') as NewTable(Categories)
.
ステートメントを実行すると、エラーが発生します。
XQuery [Rawdetails.Data.Value()]: 'value()'はシングルトンを必要とします(または タイプのオペランドが見つかりました 'xdt:untypedatomic *'
任意のアイデア?
ありがとう。
解決
私の道が間違っていたことを発見しました。
私は
を変えましたData.nodes('//ArrayOfApiNewItemDetailInfo/ApiNewItemDetailInfo') as NewTable
.
Data.nodes('//ArrayOfApiNewItemDetailInfo/ApiNewItemDetailInfo/categories/ApiNavCategoryInfo') as NewTable
.
と私はこの記録をこの
に変更しました88 Categories ../../product_id int ProviderProductId
89 Categories ../../item_id int ItemId
93 Categories id int CategoryId
.
そしてそれはうまくいった。
所属していません StackOverflow