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