繁体   English   中英

如何用存储在 SQL Server 中不同表中的值替换 XML 中的字符串?

[英]How to replace Strings in XML with values stored in different table in SQL Server?

假设有两个表

表A

Id XML

1 <A x="$Y" B="$Z" />

表B

Id Key Value

1  $Y   100

1  $Z   200

TableA 和TableB 中的Id 列可以连接。

预期的输出是

TableA

Id XML

1 <A x="100" B="200" />

Tab Alleman 提供的链接确实向您展示了此处的基本思想。 您需要使用REPLACE和递归公用表表达式 (rCTE):

CREATE TABLE TableA (Id int,
                     [XML] xml);
CREATE TABLE TableB (Id int,
                     [Key] varchar(5),
                     [Value] varchar(20));
INSERT INTO dbo.TableA (Id,
                        [XML])
VALUES(1,'<A x="$Y" B="$Z" />');

INSERT INTO dbo.TableB (Id,
                        [Key],
                        [Value])
VALUES (1,'$Y','100'),
       (1,'$Z','200');
GO


WITH RNs AS(
    SELECT B.Id,
           B.[Key],
           B.[Value],
           ROW_NUMBER() OVER (PARTITION BY B.Id ORDER BY [Key]) AS RN
    FROM dbo.TableB B),
rCTE AS(
    SELECT A.Id,
           REPLACE(CONVERT(varchar(MAX),A.[XML]),RN.[Key], RN.[Value]) AS [XML],
           RN.RN
    FROM dbo.TableA A
         JOIN RNs RN ON A.Id = RN.Id
    WHERE RN.RN = 1
    UNION ALL
    SELECT r.Id,
           REPLACE(r.[XML],RN.[Key], RN.[Value]) AS [XML],
           RN.RN
    FROM rCTE r
         JOIN RNs RN ON r.Id = RN.Id
                    AND RN.RN = r.RN + 1)
SELECT Id,
       CONVERT(xml,[xml]) AS [XML]
FROM rCTE r
WHERE RN = (SELECT MAX(RN) FROM rCTE E);

GO

DROP TABLE dbo.TableA;
DROP TABLE dbo.TableB;

作为UPDATE语句,这将是这样的:

WITH RNs AS(
    SELECT B.Id,
           B.[Key],
           B.[Value],
           ROW_NUMBER() OVER (PARTITION BY B.Id ORDER BY [Key]) AS RN
    FROM dbo.TableB B),
rCTE AS(
    SELECT A.Id,
           REPLACE(CONVERT(varchar(MAX),A.[XML]),RN.[Key], RN.[Value]) AS [XML],
           RN.RN
    FROM dbo.TableA A
         JOIN RNs RN ON A.Id = RN.Id
    WHERE RN.RN = 1
    UNION ALL
    SELECT r.Id,
           REPLACE(r.[XML],RN.[Key], RN.[Value]) AS [XML],
           RN.RN
    FROM rCTE r
         JOIN RNs RN ON r.Id = RN.Id
                    AND RN.RN = r.RN + 1)
UPDATE A
SET [XML] = r.[XML]
FROM TableA A
     JOIN rCTE r oN A.Id = r.Id
WHERE RN = (SELECT MAX(RN) FROM rCTE E);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM