在查询中分解XML字段

时间:2018-10-17 13:52:44

标签: sql xml

真的希望有人能提供帮助。这可能不是什么新鲜事物,但找不到正确的答案。

我有一个非常简单的SQL查询,可以很好地工作;

SELECT
SecUser.Name, SecUser.Description,
SecUser.IsEnabled, SecUser.ExternalAuthProviderName,
SecUser.ExternalUserName, SecUser.Email, SecUser.XmlData

FROM
SecUser

ORDER BY
SecUser.Name

但是,最后一列是XmlData,它是4个字段的组合。

<UserDetail>
 <TEXT1> "random text 1" </TEXT1>
 <TEXT2> "random text 2" </TEXT2>
 <TEXT3> "random text 3" </TEXT3>
 <TEXT4> "random text 4" </TEXT4>
 </UserDetail>

我需要帮助的是我该怎么办;

  • 将标签之间的4位文本分成各自的列?

任何帮助将不胜感激,但请注意,我是新手:(

我现在正尝试在代码中添加WHERE子句,该子句效果很好;

但是,WHERE语句不断给出“无效的列名”错误?我尝试了许多不同的方法,但似乎无法使用WHERE进行过滤?

SELECT Name, 
       Description,
       IsEnabled, 
       ExternalAuthProviderName,
       ExternalUserName, 
       Email, 
       CAST(XmlData AS XML).value('UserDetail[1]/Text1[1]', 'varchar(255)') AS "SummaryGroup",
       CAST(XmlData AS XML).value('UserDetail[1]/Text2[1]', 'varchar(255)') AS "SecurityGroup",
       CAST(XmlData AS XML).value('UserDetail[1]/Text3[1]', 'varchar(255)') AS "Access",
       CAST(XmlData AS XML).value('UserDetail[1]/Text4[1]', 'varchar(255)') AS "InsiderList"

FROM SecUser

WHERE   (UserDetail/Text1 = 'Management')

ORDER BY Name

1 个答案:

答案 0 :(得分:2)

假设XmlData的类型为XML,这将在MSSQL / T-SQL中起作用

SELECT Name, 
       Description,
       IsEnabled, 
       ExternalAuthProviderName,
       ExternalUserName, 
       Email, 
       XmlData.value('UserDetail[1]/TEXT1[1]', 'varchar(255)') AS TEXT1,
       XmlData.value('UserDetail[1]/TEXT2[1]', 'varchar(255)') AS TEXT2,
       XmlData.value('UserDetail[1]/TEXT3[1]', 'varchar(255)') AS TEXT3,
       XmlData.value('UserDetail[1]/TEXT4[1]', 'varchar(255)') AS TEXT4
FROM SecUser
ORDER BY Name

如果XmlData的类型为VARCHAR,则需要将其强制转换为XML

SELECT Name, 
       Description,
       IsEnabled, 
       ExternalAuthProviderName,
       ExternalUserName, 
       Email, 
       CAST(XmlData AS XML).value('UserDetail[1]/TEXT1[1]', 'varchar(255)') AS TEXT1,
       CAST(XmlData AS XML).value('UserDetail[1]/TEXT2[1]', 'varchar(255)') AS TEXT2,
       CAST(XmlData AS XML).value('UserDetail[1]/TEXT3[1]', 'varchar(255)') AS TEXT3,
       CAST(XmlData AS XML).value('UserDetail[1]/TEXT4[1]', 'varchar(255)') AS TEXT4
FROM SecUser
ORDER BY Name