简体   繁体   English

在SQL Server 2012中读取XML数据

[英]Read XML data in SQL Server 2012

I want to read xml data in the xml file. 我想读取xml文件中的xml数据。 I have a table column consist with the xml data. 我有一个包含xml数据的表列。 在此处输入图片说明

if i click on the xml file it will open in the Sql server Management studio. 如果我单击xml文件,它将在Sql Server Management Studio中打开。
xml file format shown below. xml文件格式如下所示。

在此处输入图片说明

I want to read only NTDomainName, DatabaseName and ServerName and write that data in the another Table. 我只想读取NTDomainName,DatabaseName和ServerName并将该数据写入另一个表中。 Table format shown below 表格格式如下所示

NTDomainName | DatabaseName | ServerName 
----------
ABC          | TestCube1    | SERXYZ

Try this: 尝试这个:

declare @xml xml
set @xml = '<event><data name="NTUserName"><value>MyName</value></data><data name="NTDomainName"><value>DomainName</value></data><data name="ServerName"><value>ServerName</value></data></event>'

select [NTDomainName], [DatabaseName], [ServerName] from
(
    select [name],[value] from (
        select c.value('./@name', 'varchar(100)') [name], c.value('(./value)[1]', 'varchar(100)') [value]
        from @xml.nodes('/event/data') as t(c)
    ) a where [name] in ('NTDomainName', 'DatabaseName', 'ServerName')
) x
pivot (
    max(value) for [name] in ([NTDomainName], [DatabaseName], [ServerName])
) as [pivot_Name] 

The most inner query will retrieve information from XML, one row for every name attribute value, that you want to retrieve. 最内部的查询将从XML中检索要检索的信息,每个name属性值一行。 So, output of this query needs to be pivoted. 因此,此查询的输出需要调整。

i think you look for this: 我认为您正在寻找:

SELECT * FROM (
SELECT 
CAST(f.x.query('data(@name)') as varchar(150)) as data_name,
CAST(f.x.query('data(value)') as varchar(150)) as data_value
FROM @xml.nodes('/event') as t(n)
CROSS APPLY t.n.nodes('data') as f(x)) X
PIVOT (MAX(data_value) FOR data_name IN (NTDomainName, DatabaseName, ServerName)) as pvt

If you do not want to use PIVOT : 如果您不想使用PIVOT

DECLARE @DataSource TABLE
(
    [ID] TINYINT IDENTITY(1,1)
   ,[XML] XML
);

INSERT INTO @DataSource ([XML])
VALUES ('<event><data name="SessionID">S1</data><data name="NTUserName">User1</data><data name="DatabaseName">DB1</data><data name="ServerName">SN1</data></event>')
      ,('<event><data name="SessionID">S1</data><data name="NTUserName">User2</data><data name="DatabaseName">DB2</data><data name="ServerName">SN2</data></event>');

SELECT [ID]
      ,MAX(CASE wHEN C.value('(./@name)[1]', 'varchar(50)')  = 'NTUserName' THEN C.value('(.)[1]', 'varchar(50)')  END) AS [NTUserName]
      ,MAX(CASE wHEN C.value('(./@name)[1]', 'varchar(50)')  = 'DatabaseName' THEN C.value('(.)[1]', 'varchar(50)')  END) AS [DatabaseName]
      ,MAX(CASE wHEN C.value('(./@name)[1]', 'varchar(50)')  = 'ServerName' THEN C.value('(.)[1]', 'varchar(50)')  END) AS [ServerName]
FROM @DataSource
CROSS APPLY [XML].nodes('event/data[@name = "NTUserName" or @name = "DatabaseName" or @name = "ServerName"]') T(c)
GROUP BY [ID];

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM