【发布时间】:2018-03-25 18:06:03
【问题描述】:
给定一个结构如下的 XML:
<ROOT_NODE>
<FOLDER_LIST>
<FOLDER>
<CODE_FOLDER>1</CODE_FOLDER>
<DESCRIPTION>This is a folder</DESCRIPTION>
<DATA_LIST>
<DATA>
<CODE_DATA>100</CODE_DATA>
<OPTIONS>
<OPTION>
<CODE_OPTION>200</CODE_OPTION>
<PRINT_TEXT>This is a test</PRINT_TEXT>
</OPTION>
<OPTION>
<CODE_OPTION>200</CODE_OPTION>
<PRINT_TEXT>This is a test</PRINT_TEXT>
</OPTION>
</OPTIONS>
</DATA>
</DATA_LIST>
</FOLDER>
</FOLDER_LIST>
</ROOT_NODE>
首先,我使用
将第一级 (FOLDER) 的值放入名为 @tmpFolders 的临时表中FROM @xml.nodes('ROOT_NODE/FOLDER_LIST/FOLDER') as folder(id)
然后我在@tmpFolders 上声明了一个光标
DECLARE cur CURSOR FOR
SELECT CODE_FOLDER, DESCRIPTION FROM @tmpFolders
OPEN cur
FETCH NEXT FROM cur INTO @codeFolder, @description
WHILE (@@FETCH_STATUS = 0)
在游标内,我使用 CROSS APPLY 将第二级 (DATA) 的值插入到另一个名为 @tmpData 的临时表中
INSERT INTO @tmpData(CODE_DATA)
SELECT data.id.value('CODE_DATA[1]','INT'))
FROM @xml.nodes('ROOT_NODE/FOLDER_LIST/FOLDER') as folder(Id)
CROSS APPLY folder.Id.nodes('DATA_LIST/DATA') as data(Id)
到目前为止,一切正常。 现在我需要从第三级(OPTION)获取值并将它们插入另一个名为@tmpOptions 的临时表中 我尝试添加另一个 CROSS APPLY 但没有成功
INSERT INTO @tmpOptions(CODE_OPTION, PRINT_TEXT)
SELECT data.id.value('CODE_DATA[1]','INT')),
option.id.value('CODE_OPTION[1]','INT'))
option.id.value('PRINT_TEXT[1]','VARCHAR(50)'))
FROM @xml.nodes('ROOT_NODE/FOLDER_LIST/FOLDER') as folder(Id)
CROSS APPLY folder.Id.nodes('DATA_LIST/DATA') as data(Id)
CROSS APPLY data.Id.nodes('OPTIONS/OPTION') as option(Id)
我没有收到任何错误,所以我不确定自己做错了什么。
【问题讨论】:
标签: xml sql-server-2008 cursor cross-apply