我想出了以下代码。但它只读取列中的一行 想要显示其他XML数据
declare @xml xml
select @xml = event_data_XML from #temp
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
输出应该是这样的(NTDomainName,DatabaseName,ServerName是xml数据)
答案 0 :(得分:0)
有很多方法可以做到这一点。我会向您展示一种我认为您最容易找到的方式。
首先,这是一张包含少量测试数据的表格:
CREATE TABLE dbo.stuff (
id int identity (1,1) primary key
, event_data_xml xml
, create_date datetime default(getdate())
, is_active bit default(1)
);
INSERT INTO dbo.stuff (event_data_xml)
VALUES ('<event name="thing" package="as">something</event>')
INSERT INTO dbo.stuff (event_data_xml)
VALUES ('<event name="otherthing" package="as">something else</event>')
---All records
SELECT * FROM dbo.[stuff];
到目前为止有意义吗?如果我想混合XML数据和列数据,请查看我使用的查询:
---Parsed up
SELECT event_data_xml.value('/event[1]', 'nvarchar(max)') AS [parsed element #text]
, event_data_xml.value('/event[1]/@name', 'nvarchar(max)') AS [parsed attribute value]
, create_date --column from table
FROM dbo.stuff
WHERE is_active = 1;
使用XML列上的value()
函数将xpath传递给我想要显示的内容,并使用SQL Server数据类型返回我想要的内容。
请确保您使用xpath表达式选择单个值。