【问题标题】:Dynamically Get XML data type Values in different Columns in SQL Server动态获取 SQL Server 中不同列中的 XML 数据类型值
【发布时间】:2020-01-20 10:22:20
【问题描述】:

我的表格有一列具有 xml 数据类型,并包含 xml 格式的值。

例如

<row><A>1</A><B>xyz</B></row>
<row><A>2</A><B>jkl</B></row>

并希望在表格中输出:

-------------
|  A  |  B  |
-------------
|  1  | xyz |
|  2  | jkl |
-------------

我想动态显示这样的输出。是否有任何函数可以将xml数据返回到表中?

【问题讨论】:

  • 动态显示是什么意思?你需要什么是动态的?
  • T-SQL 讨厌动态结果集(通常;这不限于 XML)。您可以使用 XML 方法(.nodes.query.value)来获取您喜欢的 XML 的任何部分,但不能以动态列的形式(名称或类型),而 OPENXML想要一个模式,否则它返回一个通用表。如果您知道您的数据看起来完全像这样,您可以编写一个查询将其转换为一个行集。否则,您要么需要使用动态 SQL 变得丑陋,要么将其留给客户端。
  • @Larnu - 所有列都应动态获取,无需指定列名,类型
  • SQL 不是这样工作的,@vinGa。这就像期待输入命令“MyTable”并期待 SQL Server 知道您想要 SELECT 来自它的所有列,以及可以通过外键找到的任何相关行。 需要告诉 SQL Server 您希望如何看到结果。

标签: sql sql-server xml


【解决方案1】:

你想要的似乎没有什么动态的,你只需要使用 XQUERY:

SELECT V.YourXML.value('(/row/A/text())[1]','int') AS A,
       V.YourXML.value('(/row/B/text())[1]','varchar(3)') AS B
FROM (VALUES(CONVERT(xml,'<row><A>1</A><B>xyz</B></row>')),
            (CONVERT(xml,'<row><A>2</A><B>jkl</B></row>')))V(YourXML);

【讨论】:

    【解决方案2】:

    您可以检查并尝试此查询。

    declare @X xml = '<row><A>1</A><B>xyz</B></row><row><A>2</A><B>jkl</B></row>';
    
    select  x.r.value('(A)[1]', 'varchar(100)') as [A],
        x.r.value('(B)[1]', 'varchar(500)') as [B]
    from    @X.nodes('/row') as x(r);
    

    这是输出:

    A   B
    -------
    1   xyz
    2   jkl
    

    您可以找到demo here。 要动态访问节点名称及其值,您可以尝试以下查询。

    DECLARE @input XML =  '<row><A>1</A><B>xyz</B></row><row><A>2</A><B>jkl</B></row>'
    
    SELECT
        NodeName = C.value('local-name(.)', 'varchar(50)'),
        NodeValue = C.value('(.)[1]', 'varchar(50)') 
    FROM @input.nodes('/row/*') AS T(C)
    

    它会给出如下所示的输出。想了解更多可以参考this SO answer

    NodeName    NodeValue
    --------------------
    A           1
    B           xyz
    A           2
    B           jkl
    

    【讨论】:

    • 这里你给列名,类型。我不想给它,因为实际表有更多列
    • @vinGa 您需要提供节点的名称或索引才能访问名称值。
    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多