我们有一个第三方应用程序,该应用程序使用从移动设备提交的数据生成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”?任何帮助或指导表示赞赏。
答案 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)