SQL - 将列转换为 XML,然后从所述列中查询值

问题描述

我有一个列有一堆未格式化的 XML 代码。我试图真正从列中查询 1 个值。列内的值如下所示:

<Attributes>
  <Map>
    <entry key="assignmentId" value="28df90bef6c44cf18a0da10bb12c2d66" />
    <entry key="attachmentConfigList" />
    <entry key="attachments" />
    <entry key="flow" value="AccessRequest" />
    <entry key="id" value="0a58be7a773a1abf81774a9ef2ce444a" />
    <entry key="identityEntitlementId" value="0a58be7877b1137e8177b61f500d0792" />
    <entry key="interface" value="LCM" />
    <entry key="managedAttributeType" value="Entitlement" />
    <entry key="operation" value="EntitlementAdd" />
    <entry key="provisioningPlan">
      <value>
        <ProvisioningPlan trackingId="226a73cd2a8642abadabd1e00c752983">
          <AccountRequest application="Active Directory" nativeIdentity="CN=Turtle\,Cecil" op="Modify" targetIntegration="Active Directory">
            <Attributes>
              <Map>
                <entry key="attachmentConfigList" />
                <entry key="attachments" />
                <entry key="flow" value="AccessRequest" />
                <entry key="id" value="0a58be7a773a1abf81774a9ef2ce444a" />
                <entry key="interface" value="LCM" />
                <entry key="operation" value="Add" />
                <entry key="provisioningMetaData">
                  <value>
                    <Map>
                      <entry key="entitlementAttributes">
                        <value>
                          <Map>
                            <entry key="memberOf">
                              <value>
                                <Map>
                                  <entry key="ReadItem" />
                                </Map>
                              </value>
                            </entry>
                          </Map>
                        </value>
                      </entry>
                      <entry key="linkAttributes">
                        <value>
                          <Map>
                            <entry key="distinguishedName" value="CN=Turtle\,Cecil" />
                          </Map>
                        </value>
                      </entry>
                    </Map>
                  </value>
                </entry>
                <entry key="requester" value="100051" />
                <entry key="requesterComments" value="Mr. Turtle requires access." />
              </Map>
            </Attributes>
            <AttributeRequest assignmentId="28df90bef6c44cf18a0da10bb12c2d66" displayValue="NSharePoint Read Item" name="memberOf" op="Add" trackingId="226a73cd2a8642abadabd1e00c752983" value="2">
              <Attributes>
                <Map>
                  <entry key="assignment" value="true" />
                  <entry key="comments" value="Mr. Turtle requires access." />
                </Map>
              </Attributes>
            </AttributeRequest>
          </AccountRequest>
          <Attributes>
            <Map>
              <entry key="source" value="LCM" />
            </Map>
          </Attributes>
        </ProvisioningPlan>
      </value>
    </entry>
    <entry key="requesterComments" value="Mr. Turtle requires access." />
  </Map>
</Attributes>

我正在寻找的值是 displayValue="NSharePoint Read Item" 位于行中:

<AttributeRequest assignmentId="28df90bef6c44cf18a0da10bb12c2d66" displayValue="NSharePoint Read Item" name="memberOf" op="Add" trackingId="226a73cd2a8642abadabd1e00c752983" value="2">

我有以下查询:

  ;WITH XMLNAMESPACES 
('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/IndividualSurvey' AS ns)
  select 
    (cast(attributes as xml)).value('(/ns:attributes/ns:map/ns:value)[1]','varchar(max)') 
  from [identityiq].[identityiq].[spt_identity_request_item]
  where id = '0a58be7877b1137e8177b5f3958a0740'

我一直在使用它来尝试从列中提取任何值,但无论我尝试什么,一切都返回 NULL。

寻求帮助,谢谢!

解决方法

请尝试以下解决方案。它适用于 MS SQL Server。

令人惊讶的是,所提供的 XML 没有命名空间。虽然这是尝试使用命名空间。

SQL

-- DDL and sample data population,start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY,xmldata NVARCHAR(MAX));
INSERT INTO @tbl VALUES 
(N'<Attributes>
    <Map>
        <entry key="assignmentId" value="28df90bef6c44cf18a0da10bb12c2d66"/>
        <entry key="attachmentConfigList"/>
        <entry key="attachments"/>
        <entry key="flow" value="AccessRequest"/>
        <entry key="id" value="0a58be7a773a1abf81774a9ef2ce444a"/>
        <entry key="identityEntitlementId"
               value="0a58be7877b1137e8177b61f500d0792"/>
        <entry key="interface" value="LCM"/>
        <entry key="managedAttributeType" value="Entitlement"/>
        <entry key="operation" value="EntitlementAdd"/>
        <entry key="provisioningPlan">
            <value>
                <ProvisioningPlan trackingId="226a73cd2a8642abadabd1e00c752983">
                    <AccountRequest application="Active Directory"
                                    nativeIdentity="CN=Turtle\,Cecil"
                                    op="Modify"
                                    targetIntegration="Active Directory">
                        <Attributes>
                            <Map>
                                <entry key="attachmentConfigList"/>
                                <entry key="attachments"/>
                                <entry key="flow" value="AccessRequest"/>
                                <entry key="id"
                                       value="0a58be7a773a1abf81774a9ef2ce444a"/>
                                <entry key="interface" value="LCM"/>
                                <entry key="operation" value="Add"/>
                                <entry key="provisioningMetaData">
                                    <value>
                                        <Map>
                                            <entry key="entitlementAttributes">
                                                <value>
                                                    <Map>
                                                        <entry key="memberOf">
                                                            <value>
                                                                <Map>
                                                                    <entry key="ReadItem"/>
                                                                </Map>
                                                            </value>
                                                        </entry>
                                                    </Map>
                                                </value>
                                            </entry>
                                            <entry key="linkAttributes">
                                                <value>
                                                    <Map>
                                                        <entry key="distinguishedName"
                                                               value="CN=Turtle\,Cecil"/>
                                                    </Map>
                                                </value>
                                            </entry>
                                        </Map>
                                    </value>
                                </entry>
                                <entry key="requester" value="100051"/>
                                <entry key="requesterComments"
                                       value="Mr. Turtle requires access."/>
                            </Map>
                        </Attributes>
                        <AttributeRequest assignmentId="28df90bef6c44cf18a0da10bb12c2d66"
                                          displayValue="NSharePoint Read Item"
                                          name="memberOf" op="Add"
                                          trackingId="226a73cd2a8642abadabd1e00c752983"
                                          value="2">
                            <Attributes>
                                <Map>
                                    <entry key="assignment" value="true"/>
                                    <entry key="comments"
                                           value="Mr. Turtle requires access."/>
                                </Map>
                            </Attributes>
                        </AttributeRequest>
                    </AccountRequest>
                    <Attributes>
                        <Map>
                            <entry key="source" value="LCM"/>
                        </Map>
                    </Attributes>
                </ProvisioningPlan>
            </value>
        </entry>
        <entry key="requesterComments" value="Mr. Turtle requires access."/>
    </Map>
</Attributes>');
-- DDL and sample data population,end

SELECT TRY_CAST(xmldata AS XML)
    .value('(/Attributes/Map/entry/value/ProvisioningPlan/AccountRequest/AttributeRequest/@displayValue)[1]','VARCHAR(100)') AS displayValue
FROM @tbl;

输出

+-----------------------+
|     displayValue      |
+-----------------------+
| NSharePoint Read Item |
+-----------------------+

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...