[英]How to read xml file in stored procedure and insert it in table in sql server
[英]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.