SQL - синтаксический анализ XML из нестандартного формата XML - PullRequest
0 голосов
/ 04 июля 2019

У нас есть стороннее приложение, которое генерирует файл 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», не используяопция 'query', но с помощью метода 'node', хотя я не уверен, как это сделать?Любая помощь или руководство приветствуется.

1 Ответ

1 голос
/ 04 июля 2019

Вы можете использовать метод 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...