SqlServer XML操作示例
示例1:
declare @doc xml set @doc =' <event name="sql_batch_completed" package="sqlserver" timestamp="2020-08-19T06:41:42.542Z"> <data name="cpu_time"> <value>141000</value> </data> <data name="duration"> <value>2947856</value> </data> <data name="physical_reads"> <value>12517</value> </data> <data name="logical_reads"> <value>10411</value> </data> <data name="writes"> <value>0</value> </data> <data name="row_count"> <value>0</value> </data> <data name="result"> <value>2</value> <text>Abort</text> </data> <data name="batch_text"> <value>SELECT * FROM match_nndouble </value> </data> <action name="task_time" package="sqlos"> <value>28573288</value> </action> <action name="database_name" package="sqlserver"> <value>test</value> </action> <action name="nt_username" package="sqlserver"> <value>WIN-OFM2A36CRMD\admin</value> </action> <action name="sql_text" package="sqlserver"> <value>SELECT * FROM match_nndouble </value> </action> <action name="transaction_id" package="sqlserver"> <value>0</value> </action> <action name="username" package="sqlserver"> <value>WIN-OFM2A36CRMD\admin</value> </action> </event>' declare @xmlhandle int EXEC sp_xml_preparedocument @xmlhandle OUTPUT, @doc; select @doc.value('(/event/@timestamp)[1]','datetime') as record_time, --获取最上方标题行的内容 @doc.value('(/event/@name)[1]','nvarchar(128)') as operation_name, --获取最上方标题行的内容 --data.value('(/event/data[@name="cpu_time"]/value)[1]','int')/1000 as 'cpu_time(ms)',--获得 event=>data name=cpu_time 的 value @doc.value('(/event/data[@name="duration"]/value)[1]','int')/1000 as 'exec_time(ms)',--获得 event=>data name=duration 的 value --data.value('(/event/data[@name="physical_reads"]/value)[1]','int') as 'physical_reads',--获得 event=>data name=physical_reads 的 value --data.value('(/event/data[@name="logical_reads"]/value)[1]','int') as 'logical_reads',--获得 event=>data name=logical_reads 的 value --data.value('(/event/data[@name="writes"]/value)[1]','int') as 'writes',--获得 event=>data name=writes 的 value @doc.value('(/event/data[@name="row_count"]/value)[1]','int') as 'row_count',--获得 event=>data name=row_count 的 value @doc.value('(/event/data[@name="result"]/value)[1]','int') as 'result_flag',--获得 event=>data name=result 的 value @doc.value('(/event/data[@name="result"]/text)[1]','nvarchar(128)') as 'result_desc',--获得 event=>data name=result 的 text @doc.value('(/event/data[@name="batch_text"]/value)[1]','nvarchar(max)') as 'batch_text',--获得 event=>data name=batch_text 的 text @doc.value('(/event/action[@name="sql_text"]/value)[1]','nvarchar(4000)') as 'current_sql',--获得 event=>action name=sql_text 的 value --data.value('(/event/action[@name="task_time"]/value)[1]','int')/1000 as 'task_time(ms)',--获得 event=>action name=task_time 的 value @doc.value('(/event/action[@name="database_name"]/value)[1]','nvarchar(400)') as 'database_name',--获得 event=>action name=database_name 的 value @doc.value('(/event/action[@name="transaction_id"]/value)[1]','nvarchar(400)') as 'transaction_id',--获得 event=>action name=transaction_id 的 value @doc.value('(/event/action[@name="username"]/value)[1]','nvarchar(400)') as 'username',--获得 event=>action name=transaction_id 的 value @doc.value('(/event/action[@name="nt_username"]/value)[1]','nvarchar(400)') as 'nt_username'--获得 event=>action name=transaction_id 的 value from (select * from openxml(@xmlhandle,'/event',1)) tt
执行结果:
示例2:
declare @ids xml,@doc1 int
set @ids = '<doc><id>1</id><id>2</id><id>3</id></doc>'
EXEC sp_xml_preparedocument @doc1 OUTPUT, @ids;
select BillNos.value('(text())[1]','int') as ID from @ids.nodes('/doc/id') V(BillNos)
标签:
SQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏