2011-09-29 39 views
2

我有280,000行包含名为body的列。此列包含xml数据。如何从XML列中提取数据到自己的列中?

一列值的副本如下所示。我需要将XML字段esn,timestamp_utc,Latitude,Longitudetriggers的元素中包含的数据提取到新列中,列名与元素名称相同。

我曾经在这方面做过工作,但放弃了它。我不知道如何去做。请给我任何你可能有的建议。

谢谢!!!

<?xml version="1.0" encoding="UTF-8"?> 
<telemetry> 
    <esn>1127877</esn> 
    <timestamp_utc>5/28/2011 9:18:30 PM</timestamp_utc> 
    <latitude>59.023672</latitude> 
    <longitude>-118.836408</longitude> 
    <ignition>N</ignition> 
    <geofence>0</geofence> 
    <speed>0</speed> 
    <heading>0</heading> 
    <milestraveled>0.00</milestraveled> 
    <triggers>Contact_State_Change, IO_1_Closed, No_Vibration_Detected, </triggers> 
    <miscellaneous>Standard3</miscellaneous> 
    <contact1counts>0</contact1counts> 
    <contact2counts>0</contact2counts> 
    <io1state>0</io1state> 
    <io2state>0</io2state> 
</telemetry> 
+0

如果您发布代码,XML或数据样本,**请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮(“{}”)以精确地设置格式和语法突出显示它! –

+0

谢谢!我知道我把它弄错了。 – John

回答

2

您可以使用这样的事情:

SELECT 
    ID, 
    body.value('(telemetry/esn)[1]', 'bigint') AS 'esn', 
    body.value('(telemetry/timestamp_utc)[1]', 'varchar(50)') AS 'esn', 
    body.value('(telemetry/longitude)[1]', 'float') AS 'longitude', 
    body.value('(telemetry/latitude)[1]', 'float') AS 'latitude',    
    body.value('(telemetry/timestamp_utc)[1]', 'varchar(50)') AS 'triggers' 
FROM 
    dbo.YourTableNameHere 

这是否工作,并给你正确的数据?

+0

我在运行此代码时遇到错误。它表示:找不到列“Body”或用户定义的函数或聚合“Body.value”,或名称不明确。 – John

+0

是的,每个XML中只有一个节点。 – John

+0

你有什么建议吗?这段代码看起来好像可以做到这一点! – John