动态获取 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 类型列中查找最大值