0

我从存储在共享文件服务器上的 Web 设备获取 xml 文件。xml 是池化结构的。这是一个例子:

<row>
  <cell>2000-01-01T00:00:18.000000</cell> 
  <cell>2012-02-24T14:17:12.000000</cell> 
  <cell>0.18</cell> 
  <cell>3697.26464171841</cell> 
  <cell>3697.26464171841</cell> 
  <cell>3737.1</cell> 
  <cell>10.4318</cell> 
  <cell>0.229</cell> 
</row>

每个单元元素实际上应该是不同的元素。例如,如果我要构建这个 xml 表,我会像这样格式化它:

<run>
  <startTime>2000-01-01T00:00:18.000000</startTime> 
  <EndTime>2012-02-24T14:17:12.000000</EndTime> 
  <effeicency>0.18</effeicency> 
  <good>3697.26464171841</good> 
  <bad>3697.26464171841</bad> 
  <average>3737.1</average> 
  <oee>10.4318</oee> 
  <up>0.229</up> 
</run>

我正在使用 SSIS XML 源来获取它并获得以下信息:

Cell|row_id
2001-01-01|3
2001-01-01|3
0.18|3
3697.264|3
3697.264|3
3737.1|3
10.431|3
0.229|3
2012-01-01|4
2012-01-01|4
0.15|4
698.222|4
397.204|4
337.1|4
11.531|4
0.219|4
... 
...

所以我的问题是,我是否可以使用一些转换来旋转数据,即使我认为我在源中只有 2 列并且我没有在任何事情上进行汇总?我的预期输出是

2001-01-01|   2001-01-01|    0.18|    3697.264|    3697.264|    3737.1|    10.431|   0.229
4

1 回答 1

0

这个解决方案可能无法针对大量记录进行扩展,但它对我来说很头疼。关键是使用 XPath 导航 XML 并将元素转换为适当的数据类型。

我不知道主键是什么,我将在此示例中使用 ApplianceRowID。所以表结构会是这样的

CREATE TABLE [dbo].[WebApplianceStaging] (
ApplianceRowID [int] IDENTITY (1,1) NOT NULL,
RowData [nvarchar] (max) NULL
CONSTRAINT [PK_ApplianceRowID] PRIMARY KEY CLUSTERED
(
    [ApplianceRowID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,  
   ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]    

编写您的 SSIS 导入以引入此数据,然后在 SSIS 或存储过程中将 XML 数据转换为适当的字段类型并插入您的最终表格。

在这里,我使用的是公用表表达式,并且由于小数位数,我只是使用浮点数作为数据类型,最初将日期设为 varchar,然后使用左函数和 126 格式说明符转换为日期时间。因为它是 XML,所以存在值为空字符串的风险,因此您需要将这些字段设为空,因此 nullif:

;WITH ApplianceRow(RowID, RowDataRaw) as
(
    SELECT ApplianceRowID, RowData 
    FROM WebApplianceStaging
)
INSERT INTO [dbo].[FinalTable]  --Your Final Table
([RowID],[StartTime],[EndTime],[Efficiency],[good],[bad],[average],[oee],[up])
SELECT 
    RowID
    --,RowDataRaw
    --,XML_Encoded
    ,CONVERT(
       DATETIME
       ,LEFT(NULLIF(XML_Encoded.value('/row[1]/cell[1]','varchar(50)'),''),19)
       ,126
      ) AS StartTime
    ,CONVERT(
       DATETIME
       ,LEFT(NULLIF(XML_Encoded.value('/row[1]/cell[2]','varchar(50)'),''),19)
       ,126
      ) AS EndTime
    ,NULLIF(XML_Encoded.value('/row[1]/cell[3]','float'),'') AS efficiency
    ,NULLIF(XML_Encoded.value('/row[1]/cell[4]','float'),'') AS good
    ,NULLIF(XML_Encoded.value('/row[1]/cell[5]','float'),'') AS bad
    ,NULLIF(XML_Encoded.value('/row[1]/cell[6]','float'),'') AS average
    ,NULLIF(XML_Encoded.value('/row[1]/cell[7]','float'),'') AS oee
    ,NULLIF(XML_Encoded.value('/row[1]/cell[8]','float'),'') AS up
FROM ApplianceRow
CROSS APPLY
(
     SELECT XML_Encoded = CAST(RowDataRaw AS XML)
) as XML_Encoded
于 2012-08-21T18:19:03.563 回答