SQL-从非标准XML格式进行XML解析

时间:2019-07-04 13:19:12

标签: sql sql-server xml tsql xml-parsing

我们有一个第三方应用程序,该应用程序使用从移动设备提交的数据生成XML文件。它将返回到SQL数据库表中,并位于XML类型字段中。

我需要提供一些具体的答案,这些答案我似乎已经得出了一定的结论,但我想知道是否可以使用“节点”或某种形式的“外部申请/交叉申请”加入这项工作,然后直接查询而不是按每个值查询整行。

以下示例:

CREATE TABLE [dbo].[zz_PhoneData_Test](
    [RecID] [bigint] NOT NULL,
    [TasksetID] [bigint] NULL,
    [FormData] [xml] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
INSERT [reports].[zz_PhoneData_Test] ([RecID],[TasksetID], [FormData]) VALUES (35512921264, 593, N'<fd u="=afa01113c0674a3fbdc8354c7aa538ab" b="0" v="1"><field i="1">12345</field><field i="2">E-mail Test</field><field i="3">1</field></fd>')





WITH [cte_test] AS
(
    SELECT TOP(10)
           [pd].[RecId],
           REPLACE(REPLACE(CAST(FormData.query('/fd/field[@i=1]') AS NVARCHAR(100)),'<field i="1">',''),'</field>','') AS [Order]
    FROM reports.[zz_PhoneData_Test] [pd]
)

SELECT  [cte].[RecId],
        [cte].[Order],
        CASE WHEN PATINDEX('[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][-][0-9][0-9][0-9][0-9]', [Order] ) = 1 THEN 'Valid'
             WHEN PATINDEX('[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]', [Order] ) = 1 THEN 'Valid'
             WHEN PATINDEX('[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9]', [Order] ) = 1 THEN 'Valid'
             ELSE 'Invalid' END AS [Validation]
FROM [cte_test] [cte]
GO

有了上面的内容,就足以为您提供我所要达到的示例,请忽略PATINDEX,因为可以忽略测试,我希望能够提取3个答案中的每个答案的值尽管我不确定如何执行此操作,但不使用“查询”选项而是通过“节点”方法使用“ XML”?任何帮助或指导表示赞赏。

1 个答案:

答案 0 :(得分:1)

您可以像这样使用nodes方法:

SELECT t.RecID
     , t.TasksetID
     , n.field.value('@i', 'INT') AS attr
     , n.field.value('.', 'NVARCHAR(100)') AS text
FROM PhoneData AS t
CROSS APPLY t.FormData.nodes('/fd/field') AS n(field)