SQL Server 使用SQL将所有XML条目键值提取为行

jei2mxaa  于 2023-01-16  发布在  其他
关注(0)|答案(1)|浏览(122)

我试图从表中的一行提取键值(1,2,3),但是我一次只能提取一行:

cast([attributes] as XML).value('(//Map/entry[@key="catalogItem"]/value/Map/entry/@key)[1]','VARCHAR(20)')

根据我在[x]中输入的数字,我会得到那个条目。我试图删除[x],但得到了错误:XQuery [值()]:“value()”需要单例(或空序列),找到类型为“xdt:untypedAtomic *”的操作数

<Map>
               <entry key="catalogItem">
                 <value>
                   <Map>
                     <entry key="1" value="x"/>
                     <entry key="2" value="y"/>
                     <entry key="3" value="z"/>

我希望结果为单列
1
2
3

j9per5c4

j9per5c41#

请尝试以下解决方案。
XQuery方法.nodes().value()的组合满足了您的需要。

    • SQL语言**
-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, XMLColumn XML);
INSERT INTO @tbl (XMLColumn) VALUES
(N'<Map>
    <entry key="catalogItem">
        <value>
            <Map>
                <entry key="1" value="x"/>
                <entry key="2" value="y"/>
                <entry key="3" value="z"/>
            </Map>
        </value>
    </entry>
</Map>');
-- DDL and sample data population, end

SELECT t.* 
    , c.value('@key', 'INT') AS [key]
FROM @tbl AS t
    CROSS APPLY XMLColumn.nodes('/Map/entry/value/Map/entry') AS t1(c);
    • 产出**

| 身份证|键|
| - ------|- ------|
| 1个|1个|
| 1个|第二章|
| 1个|三个|

相关问题