【发布时间】:2026-02-15 06:15:01
【问题描述】:
我在 SQL Server 中有一个数据库,其中一列是 XML,其内容(根、子和子子)可能会根据给定参数而有所不同,其中有 30 多种不同的类型。
Image of the database filtered by a provided number
只要我无权访问文档并且我不知道它们的结构(非类型化数据),我需要找到一种机制来转换将此 XML 列的内容转换为新数据库的变量。
我的意思是:查询将识别我的 XML 的内容(节点的数量也可以变化),组织根、子和子子,将其放入表中。您能否看一下代码并就如何将一行一行(这就是代码所做的)转换为表格提供一些建议?谢谢!
DECLARE @xmlText VARCHAR(MAX)
SELECT TOP 1 @xmlText = CAST(ContenuTransmission AS VARCHAR(MAX)) FROM pgisCBL.dbo.Transmission WHERE NoReferenceTransmission = '1411130048'
IF OBJECT_ID('tempdb..#xmlTest') IS NOT NULL DROP TABLE #xmlTest -- SELECT * FROM #xmlTest WHERE TagType = 3
SELECT
ID
,Valeur + '>' as Tag
,CASE WHEN LEFT(Valeur + '>',2) = '</' AND RIGHT(Valeur + '>',1) = '>' THEN 3 -- EndSection
WHEN LEFT(Valeur + '>',1) = '<' AND RIGHT(Valeur + '>',1) = '>' AND CHARINDEX('=', Valeur + '>') > 0 THEN 1 -- Section with values
WHEN LEFT(Valeur + '>',1) = '<' AND RIGHT(Valeur + '>',1) = '>' AND CHARINDEX('=', Valeur + '>') = 0 THEN 1 -- Section start
ELSE 2 -- Value for previous section start
END AS TagType
INTO #xmlTest
FROM IG.dbo.ftSplitDelimiteMax(@xmlText,'>')
WHERE Valeur + '>' <> '>'
SELECT * FROM #xmlTest
-- IDENTIFY INDENTS AND OUTDENTS AND PUT THE ELEMENTS SIDE BY SIDE
; WITH
cteOutdent AS (SELECT
ID
,REPLACE(REPLACE(Tag,'/',''),'>','') AS Tag
,LEN(REPLACE(REPLACE(Tag,'/',''),'>','')) AS LenTag
,-2 AS Indent
FROM #xmlTest
WHERE TagType = 3)
, cteIndent AS (SELECT
#xmlTest.ID + 1 AS ID
,#xmlTest.Tag
,2 AS Indent
FROM #xmlTest
INNER JOIN cteOutdent
ON cteOutdent.Tag = LEFT(#xmlTest.Tag,cteOutdent.LenTag)
WHERE TagType <> 3)
, cteIndents AS (SELECT DISTINCT
ID,
Indent
FROM cteIndent
UNION
SELECT DISTINCT
ID,
Indent
FROM cteOutdent)
SELECT
a.ID
,CASE WHEN b.TagType = 2 THEN a.Tag + b.Tag ELSE a.tag END AS xmlLine
,ISNULL(cteIndents.Indent,0) AS Indent
FROM
#xmlTest a
LEFT JOIN #xmlTest b
ON b.id = a.ID + 1
LEFT JOIN cteIndents ON cteIndents.Id = a.ID
WHERE a.TagType in (1,3)
ORDER BY a.ID
【问题讨论】:
-
所以,您希望我们了解它们的结构并为您提供将 xml 转换为 db 表行的代码,对吧?为什么你认为这是可能的?
-
其实不是。我正在寻找一种通用解决方案,该解决方案能够识别 xml 结构并对其进行组织,而无需声明我正在寻找的变量的名称(我不知道)。
-
那你还得等一等,人工智能还没发明出来
-
如果您需要有关您正在尝试的解决方案的帮助或需要反馈,这是一回事。但是您是否只是发布了您想做的事情并要求 SO 为您做这件事?
-
对不起,你是对的,我本可以更具体一些,应该就一个例子征求意见。这就是我想要做的,它逐行放置我的节点。我将分两部分发布:
标签: sql sql-server xml reporting-services