Я должен уделить этой проблеме много времени и поисков. Я даже почти получаю вывод, но проблема в том, что соединение со многими вызывает мою проблему.
вот мои данные
--notice some of the Account nodes have elements that others don't
DECLARE @tbl TABLE(ID INT,fkey int, YourXML XML)
INSERT INTO @tbl (id, fkey, YourXML)
SELECT
98, 8,
N'<Params>
<Account>
<FirstName>Michael</FirstName>
<LastName>Bar</LastName>
<tcode>8</tcode>
</Account>
<Account>
<FirstName>Pam</FirstName>
<LastName>Bar</LastName>
</Account>
</Params>'
UNION
SELECT
99, 9,
N'<Params>
<Account>
<FirstName>Phil</FirstName>
<LastName>Foo</LastName>
</Account>
<Account>
<FirstName>Rebecca</FirstName>
<LastName>Foo</LastName>
<whatever>argh</whatever>
</Account>
</Params>'
DECLARE @tbl2 TABLE(id INT, fkey INT, sfirst VARCHAR(255), slast VRACHAR(255))
INSERT INTO @tbl2 (id, fkey, sfirst, slast)
SELECT 1, 8, 'Michael', 'Bar'
UNION
SELECT 2, 8, 'Pam', 'Bar'
UNION
SELECT 3, 9, 'Phil', 'Foo'
UNION
SELECT 4, 9, 'Rebecca', 'Foo'
--expected output
/* expected output
<Params>
<Account>
<FirstName>first1</FirstName>
<LastName>last1</LastName>
<tcode>8</tcode>
</Account>
<Account>
<FirstName>first2</FirstName>
<LastName>last2</LastName>
</Account>
<Account>
<FirstName>first3</FirstName>
<LastName>last3</LastName>
</Account>
<Account>
<FirstName>first4</FirstName>
<LastName>last4</LastName>
<whatever>argh</whatever>
</Account>
</Params>'
*/
Окончательным решением стал код, который выглядел следующим образом, но не содержал переменные теги xml, такие как <tcode>
, который был в одной учетной записи, и <whatever>
, который был в другой
;WITH cte AS
(
SELECT
YourXML,
(SELECT DISTICNT
'first' + REPLACE(STR(se.ID,9),' ','') AS FirstName,
'last' + REPLACE(STR(se.ID,9),' ','') AS LastName
FROM
@tbl AS sea
INNER JOIN
@tbl2 se ON sea.fkey = se.fkey
CROSS APPLY
sea.YourXML.nodes(N'/Params/Account') AS x(nth)
WHERE
sea.id = ilv.id
FOR XML PATH('Account'), ROOT('Params'), TYPE) AS NewAdditionalInfo
FROM
@tbl AS ilv
)
UPDATE cte
SET YourXML = NewAdditionalInfo;
Затем я выполнил двойной вложенный цикл while: 1 для идентификатора @tbl
и 2 для count()
на количестве узлов.
Я заметил, что
update @tbl
set YourXML.modify('replace value of (//Account/FirstName/text())[sql:variable("@tenantcount")][1] with concat(sql:column("sfirst"),sql:column("ValTbl.id") cast as xs:string ?)')
....
where @tbl.id = @current_id
работал, но опять-таки стал бы жертвой проблемы один ко многим