将XML数据分解到表中
我有一个问题,我必须通过将源中的各种元素映射到我自己的表,将来自多个提供者的多个xml数据集分解成一组表。当我收集顶级信息时,我可以很好地做到这一点,但我的一些信息是在一个集合中,例如类别。我的第一步只是从XML中提取数据并将其放入几个表中,然后下一步是将数据合并到实际的表中 我的XML数据如下所示:将XML数据分解到表中,xml,tsql,sql-server-2008,shred,Xml,Tsql,Sql Server 2008,Shred,我有一个问题,我必须通过将源中的各种元素映射到我自己的表,将来自多个提供者的多个xml数据集分解成一组表。当我收集顶级信息时,我可以很好地做到这一点,但我的一些信息是在一个集合中,例如类别。我的第一步只是从XML中提取数据并将其放入几个表中,然后下一步是将数据合并到实际的表中 我的XML数据如下所示: <ArrayOfApiNewItemDetailInfo> <ApiNewItemDetailInfo> <categories> &l
<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>
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)
在此表中,我有以下记录:
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语句如下所示:
<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>
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:非类型数据组*”
有什么想法吗
谢谢。我发现我的路径错了 我变了
Data.nodes('//ArrayOfApiNewItemDetailInfo/ApiNewItemDetailInfo') as NewTable
到
我用这个改变了我的记录
88 Categories ../../product_id int ProviderProductId
89 Categories ../../item_id int ItemId
93 Categories id int CategoryId
这就成功了。FYI,XML没有出现……在IE和Firefox中都有检查。