SQL SERVER 如何读取类型为XML的字段

SQL SERVER 读取XML类型字段的方式。

操作方法

  • 01

    先创建一个测试的临时表: --    测试数据--    DROP TABLE #XMLTabCREATE TABLE #XMLTab(colxml XML)INSERT INTO #XMLTab SELECT N'<Record id="1629">  <Exception type="RING_BUFFER_EXCEPTION">    <Task address="0x0062B8E8" />    <Error>9003</Error>    <Severity>error</Severity>  </Exception>  <Exception type="BUFFER_EXCEPTION">    <Task address="0xC452BB39" />    <Error>8008</Error>    <Severity>true</Severity>  </Exception></Record>'INSERT INTO #XMLTab SELECT N'<Record id="1611">  <Exception type="RING_BUFFER_EXCEPTION">    <Task address="" />    <Error>7803</Error>    <Severity>false</Severity>  </Exception>  <Exception type="BUFFER">    <Task address="0xC4445674" />    <Error>4300</Error>    <Severity>right</Severity>  </Exception></Record>'SELECT colxml FROM #XMLTab

  • 02

    读取XML字段方法有两种,方法一: SELECT CONVERT(NVARCHAR(50),colxml.query('data(/Record/@id)')) AS [id] ,CONVERT(NVARCHAR(MAX),colxml.query('data(/Record/Exception/@type)[1]')) AS [type1] ,CONVERT(NVARCHAR(MAX),colxml.query('data(/Record/Exception/Task/@address)[1]')) AS [address1] ,colxml.value('data(/Record/Exception/Error)[1]','varchar(max)') AS [Error1] ,colxml.value('data(/Record/Exception/Severity)[1]','varchar(10)') AS [Severity1] ,CONVERT(NVARCHAR(MAX),colxml.query('data(/Record/Exception/@type)[2]')) AS [type2] ,CONVERT(NVARCHAR(MAX),colxml.query('data(/Record/Exception/Task/@address)[2]')) AS [address2] ,colxml.value('data(/Record/Exception/Error)[2]','varchar(MAX)') AS [Error2] ,colxml.value('data(/Record/Exception/Severity)[2]','varchar(10)') AS [Severity2] FROM #XMLTab

  • 03

    方法二: SELECT node.c1.value('(@id)[1]','VARCHAR(50)') AS [id] ,node.c1.value('(Exception/@type)[1]','VARCHAR(50)') AS [type1] ,node.c1.value('(Exception/Task/@address)[1]','VARCHAR(50)') AS [address1] ,node.c1.value('(Exception/Error)[1]','VARCHAR(max)') AS [Error1] ,node.c1.value('(Exception/Severity)[1]','VARCHAR(max)') AS [Severity1] ,node.c1.value('(Exception/@type)[2]','VARCHAR(50)') AS [type2] ,node.c1.value('(Exception/Task/@address)[2]','VARCHAR(50)') AS [address2] ,node.c1.value('(Exception/Error)[2]','VARCHAR(max)') AS [Error2] ,node.c1.value('(Exception/Severity)[2]','VARCHAR(max)') AS [Severity2] FROM #XMLTab CROSS APPLY colxml.nodes('/Record') as node(c1) 两种方法都可以得到下面的效果:

  • 04

    其他的用法,比如:将同一节点下的数据合并为一行, SELECT colxml.query('data(/Record/Exception/@type)[1]')  AS [type1] ,colxml.query('data(/Record/Exception/@type)[2]')  AS [type2] ,colxml.query('data(/Record/Exception/@type)') ,CONVERT(NVARCHAR(MAX),colxml.query('data(/Record/Exception/@type)')) ,REPLACE(CONVERT(NVARCHAR(MAX),colxml.query('data(/Record/Exception/@type)')),' ',',') FROM #XMLTab

  • 05

    测试合并结果: SELECT CONVERT(NVARCHAR(50),colxml.query('data(/Record/@id)')) AS [id] ,REPLACE(CONVERT(NVARCHAR(MAX),colxml.query('data(/Record/Exception/@type)')),' ',',') AS [type] ,REPLACE(CONVERT(NVARCHAR(MAX),colxml.query('data(/Record/Exception/Task/@address)')),' ',',') AS [address] ,REPLACE(CONVERT(NVARCHAR(MAX),colxml.query('data(/Record/Exception/Error)')),' ',',') AS [Error] ,REPLACE(CONVERT(NVARCHAR(MAX),colxml.query('data(/Record/Exception/Severity)')),' ',',') AS [Severity] FROM #XMLTab

(0)

相关推荐

  • SQL Server数据库损坏检测以及SQL Server数据库修复的解决方法

    在一个理想的世界中,不会存在任何数据库的损坏,就像我们不会将一些严重意外情况列入我们生活中的日常一样,而一旦这类事情发生,一定会对我们的生活造成非常显著的影响,在SQL Server中也同样如此,或许 ...

  • SQL Server如何设置表主键(或其他字段)递增

    本篇主要为大家介绍一下如何设置SQL Server使表主键或其他字段递增或递减. 操作方法 01 首先,待设置的字段类型一定要是int型的,否则不能设置"标识规范". 02 打开S ...

  • 如何利用SQL Server 2012数据库对表排序和分组

    SQL Server 2012数据库对数据库表某个字段或某些字段进行排序或分组,需要用到order by或group by.其中,字段排序order by可以根据排序方向分为:正序和倒序:分组的话直接 ...

  • 如何控制SQL Server中的跟踪标记

    跟踪标记是什么? 对于DBA来说,掌握Trace Flag是一个成为SQL Server高手的必要条件之一,在大多数情况下,Trace Flag只是一个剑走偏锋的奇招,不必要,但在很多情况下,会使用这 ...

  • 安装SQL Server 2005的详细步骤

    下面就开始使用安装向导进行安装,安装的SQL Server 2005版本为Microsoft SQL Server 2005 Enterprise Edition(32),共两张光盘. 提示 本书安装 ...

  • 如何使用SQL Server命令BCP 导入导出EXCEL数据

    sql语句导出sever中的数据到Excel中 操作方法 01 SQL Server BCP 导入导出使用 Bcp 导出导入数据高效,比使用SQL Server Management Stdio 提供 ...

  • unity3d怎么连接sql server数据库

    虽然在Unity3D中能够通过PlayerPrefs类来保存和读取数据,但是一旦数据量增大,仅仅通过代码的方式存取数据,这样的工作量是非常大的。那么如何通过使用Sql Server数据库来存取数据呢? ...

  • SQL Server中事务和并发详解

    A、Transaction(事务)是什么: 事物是SQL Server中的基本工作单元。通常它由几个读取和更新数据库的SQL命令组成,但是这些操作都不被看为最终的,直到发出一个COMMIT命令为止。 ...

  • SQL Server数据类型的介绍

    同时又比它增加了许多更先进的功能具有使用方便可伸缩性好与相关软件集成程度高等优点可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2000 的 ...