문제

소스의 다양한 요소를 내 테이블에 매핑하여 여러 공급자에서 여러 개의 테이블 세트로 여러 개의 XML 데이터 세트를 파쇄 해야하는 문제가 있습니다. 최상위 수준의 정보를 수집 할 때이 작업을 수행 할 수 있지만 일부 정보 중 일부는 범주와 같은 컬렉션에 있습니다. 내 첫 번째 단계는 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가있는 테이블 에이 데이터를 테이블에 파쇄하고 여러 범주를 단일 제품에 할당 할 수 있습니다

첫째, 나의 datadictionary 테이블

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 
.

그리고 그 일이 일했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top