【问题标题】:Is there any way to find out specific tag values from XML?有没有办法从 XML 中找出特定的标签值?
【发布时间】:2019-04-24 06:44:26
【问题描述】:

我正在使用扩展事件设置警报,在该事件中我以 XML 格式提取信息,因此我陷入了查找值 - 此 XML 中的对象名称。

SELECT CAST(data AS XML) AS [result] 
FROM #temp  
WHERE data LIKE '%<text>Abort</text>%'

使用此查询,我以 XML 格式提取了那些超时的记录,通过此 xml,我们需要使用 T-SQL &lt;value&gt;XYZ&lt;/value&gt;&lt;/data&gt;XYZ 值作为对象名称提取 p>

上述选择查询的输出:

<event name="rpc_completed" package="sqlserver" timestamp="2019-02-20T14:42:39.678Z"><data name="cpu_time"><value>15000</value></data><data name="duration"><value>29999325</value></data><data name="physical_reads"><value>0</value></data><data name="logical_reads"><value>363</value></data><data name="writes"><value>0</value></data><data name="result"><value>2</value><text>Abort</text></data><data name="row_count"><value>9</value></data><data name="connection_reset_option"><value>0</value><text>None</text></data><data name="object_name"><value>XYZ</value></data><data name="statement"><value>exec XYZ </value></data><data name="data_stream"><value /></data><data name="output_parameters"><value /></data><action name="transaction_id" package="sqlserver"><value>0</value></action><action name="session_id" package="sqlserver"><value>1381</value></action><action name="server_principal_name" package="sqlserver"><value>sq</value></action><action name="database_name" package="sqlserver"><value>PR</value></action><action name="database_id" package="sqlserver"><value>5</value></action><action name="client_pid" package="sqlserver"><value>32048</value></action><action name="client_hostname" package="sqlserver"><value>RuntimeHost</value></action><action name="client_app_name" package="sqlserver"><value>test</value></action><action name="event_sequence" package="package0"><value>133050</value></action></event>

NA

输出应该是这样的:

Object Name
XYZ

【问题讨论】:

    标签: sql sql-server xml tsql


    【解决方案1】:

    您可以使用nodes按属性值过滤xml中的项目,然后使用value提取您需要的数据:

    ;with x as(
        SELECT CAST(data AS XML) AS [result] 
        FROM #temp  
        WHERE data LIKE '%<text>Abort</text>%'
    )
    select 
        t.s.value('.', 'nvarchar(max)') as object_name
    from
        x
    cross apply 
        [result].nodes('//data[@name = "object_name"]/value') t(s)
    

    结果:


    编辑

    检索database_name 的一种方法是在action 标签上添加另一个nodes 过滤。要获得timestamp,您只需在select 子句中添加value,指定正确的xpath 表达式:

    ;with x as(
        SELECT CAST(data AS XML) AS [result] 
        FROM #temp  
        WHERE data LIKE '%<text>Abort</text>%'
    )
    select 
          t.s.value('.', 'nvarchar(max)') as [object_name]
        , u.s.value('.', 'nvarchar(max)') as [database_name]
        , [result].value('(/event/@timestamp)[1]', 'nvarchar(max)') as [timestamp]
    from
        x
            cross apply 
        [result].nodes('//data[@name = "object_name"]/value') t(s)
            cross apply  
        [result].nodes('//action[@name = "database_name"]/value') u(s)
    

    database_nametimestamp 的结果:

    【讨论】:

    • 我也在尝试添加数据库名称和时间戳,但使用节点没有运气
    • 对上述输出中的时间戳感到困惑,因为扩展事件中的实际时间戳不同,而在 XML 中则不同。我试图将其转换为日期时间,但没有成功。
    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多