Я хочу вставить данные XML в таблицу sql в хранимой процедуре. Я хочу вставить значения CNAME и AMOUNT. Как добиться этого с помощью XML ниже?
<ENTITY>
<CNAME>
<NAME>FGGFGFGF</NAME>
</CNAME>
<AMOUNT>
<AMOUNT1></AMOUNT1>
<AMOUNT2>67052549.33</AMOUNT2>
</AMOUNT>
<CNAME>
<NAME>FGGFGFGF</NAME>
</CNAME>
<AMOUNT>
<AMOUNT1></AMOUNT1>
<AMOUNT2>67052549.33</AMOUNT2>
</AMOUNT>
</ENTITY>
INSERT INTO Table1(NAME,AMOUNT1, AMOUNT2) SELECT t.c.value('(NAME)[1]', 'varchar(50)') AS NAME, d.c.value('(AMOUNT1)
[1]', 'varchar(50)') AS AMOUNT1, d.c.value('(AMOUNT2)[1]','varchar(50)') as
AMOUNT2 FROM @xmlData.nodes('/ENTITY') m(c) CROSS APPLY m.c.nodes(N'CNAME')
t(c) CROSS APPLY m.c.nodes(N'AMOUNT') d(c)
Нет, это другое, я пробовал, как я использовал две функции CROSS APPLY, тогда он зацикливается два раза...
Хорошо, если вы можете поставить свой sql-запрос, чтобы он дал больше разъяснений, что именно в нем не так.
Я обновил с помощью редактора запросов
С XML сложно работать, используя SQL Server. Я считаю, что использовать другой язык программирования для чтения xml и сохранения в базе данных проще.
Это нормально, никаких проблем на данный момент. у вас есть решение для этого ..?
Это должно дать вам результат, который вам нужен, обязательно проверьте типы данных
DECLARE @XML AS XML= N'
<ENTITY>
<CNAME>
<NAME>FGGFGFGF</NAME>
</CNAME>
<AMOUNT>
<AMOUNT1></AMOUNT1>
<AMOUNT2>67052549.33</AMOUNT2>
</AMOUNT>
<CNAME>
<NAME>FGGFGFGF</NAME>
</CNAME>
<AMOUNT>
<AMOUNT1>
</AMOUNT1>
<AMOUNT2>67052549.33</AMOUNT2>
</AMOUNT>
</ENTITY> '
SELECT nme.ROWID
,nme.NAME
,amt.AMOUNT1
,amt.AMOUNT2
FROM
(
SELECT TRY_CONVERT(NVARCHAR(50),nme.value('(NAME/text())[1]', 'VARCHAR(MAX)')) AS NAME
,ROW_NUMBER() OVER (ORDER BY T.nme) AS ROWID
FROM @XML.nodes('ENTITY/CNAME') AS T(nme)
)nme
LEFT OUTER JOIN
(
SELECT TRY_CONVERT(MONEY,amt.value('(AMOUNT1/text())[1]', 'VARCHAR(MAX)')) AS AMOUNT1
,TRY_CONVERT(MONEY,amt.value('(AMOUNT2/text())[1]', 'VARCHAR(MAX)')) AS AMOUNT2
,ROW_NUMBER() OVER (ORDER BY T.amt) AS ROWID
FROM @XML.nodes('ENTITY/AMOUNT') AS T(amt)
)amt
ON nme.ROWID = amt.ROWID
OPTION (OPTIMIZE FOR (@XML = NULL))
<ENTITY> <CNAME> <NAME>FGGFGFGF</NAME> </CNAME> <AMOUNT> <AMOUNT1></AMOUNT1> <AMOUNT2>67052549,33</AMOUNT2> </AMOUNT> <CNAME> <NAME>FGGFGFGF</NAME > </CNAME> <СУММА> <СУММА1></СУММА1> <СУММА2>67052549,33</СУММА2> </СУММА> </ENTITY>
Если это действительно ваша схема xml, вы можете сделать это с отредактированным кодом, предполагается, что для каждой суммы есть имя, и что порядок их появления в xml является отношением между именем и суммой.
Я обновил свой ответ, чтобы обрабатывать несколько группировок внутри объекта.
Я проверю и дам вам знать
возможно дубликат этого: stackoverflow.com/questions/50562028/…