动态获取 SQL Server 中不同列中的 XML 数据类型值

Posted

技术标签:

【中文标题】动态获取 SQL Server 中不同列中的 XML 数据类型值【英文标题】:Dynamically Get XML data type Values in different Columns in SQL Server 【发布时间】: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 您希望如何看到结果。 【参考方案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 您需要提供节点的名称或索引才能访问名称值。

以上是关于动态获取 SQL Server 中不同列中的 XML 数据类型值的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:选择一列的计数,同时检查另一列中的不同值

如何为每个表计算由 SQL Server 中未指定数量的表共享的列中的不同值?

Linq - 从 SQL Server 中的 nvarchar 类型列中查找最大值

SQL Server 2008 R2:从列中获取第一个非空值

SQL Server 2005 中的水平到垂直表转换

如何在具有相同 ID 的列中选择不同的值然后删除它们 PHP SQL Server