Изменение атрибута XML в зависимости от другого атрибута
Эй ребята,
вот мой вопрос:
я вызываю хранимую процедуру, которая получает xml в качестве параметра.
вот xml, который я отправляю:
<Root> <Categories> <TopCategory></TopCategory> <MediumCategory></MediumCategory> <SubCategory>tomato</SubCategory> </Categories> <Categories> <TopCategory></TopCategory> <MediumCategory></MediumCategory> <SubCategory>banana</SubCategory> </Categories> <Categories> <TopCategory></TopCategory> <MediumCategory></MediumCategory> <SubCategory>apple</SubCategory> </Categories> <Root>
в СП, я хочу перебрать узлы, используя курсор и узлов по каждому элементу ,
получение значения<SubCategory & gt; и serach в других таблицах (tblMediumCategory, tblTopCategory) для вставки значения.
В конце концов, я хочу вернуть xml в качестве вывода.
то, что я сейчас делаю, - это преобразование xml в таблицу, и с помощью курсора Я успешно могу получить все подкатегории.
Проблема в том, когда я хочу обновить узел. я не знаю, как установить предложение WHERE, я не знаю, как сказать sql обновить определенный etc <TopCategory> where <SubCategory> = BlaBla.
Вот как выглядит SP до сих пор:
ALTER PROCEDURE [dbo].[SP_GetCategories] @xmlCat xml AS BEGIN --=============================== DECLARE @str nvarchar(max) DECLARE @tmpMedium nvarchar(50), @tmpTop nvarchar (50) DECLARE @idoc INT declare @tmpTbl table(id int, parentId int, nodetype int, localname nvarchar(max), prefix nvarchar(max), namespaceuri nvarchar(max), datatype nvarchar(max), prev int, [text] nvarchar(max)) --=============================== EXEC sys.sp_xml_preparedocument @idoc OUTPUT, @xmlCat --=============================== INSERT INTO @tmpTbl SELECT * FROM OPENXML (@idoc, '/Root', 2) --=============================== DECLARE MY_CURSOR CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR SELECT DISTINCT t.text FROM @tmpTbl t --=============================== OPEN MY_CURSOR FETCH NEXT FROM MY_CURSOR INTO @str WHILE @@FETCH_STATUS = 0 BEGIN --=============================== SELECT @tmpMedium = m.CategoryName, @tmpTop = t.CategoryName FROM tblSubSources s JOIN tblMediumSources m ON s.MediumSourceId = m.CategoryId JOIN tblTopSources t ON m.TopCategoryId = t.CategoryId WHERE s.SubSourceName = @str --=============================== SET @xmlCat.modify('replace value of (/Rows/Categorys/@TopCategory)[1] with sql:variable("@tmpTop")') ************************************This is where the <WHERE> Clause suppouse to be!!!!!!!!!!!!!!!!********************************** --=============================== FETCH NEXT FROM MY_CURSOR INTO @str --=============================== END --=============================== CLOSE MY_CURSOR DEALLOCATE MY_CURSOR --=============================== EXEC SYS.SP_XML_REMOVEDOCUMENT @idoc --=============================== END
Кто-нибудь может мне помочь, пожалуйста?
Что я уже пробовал:
.............................................
Homero Rivera
Комментарий, Ваш XML-файл не совсем точно закрыт. последний элемент должен быть /Root