我从存储在共享文件服务器上的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列,而且我并没有对anthing进行整理?我的预期输出是
2001-01-01| 2001-01-01| 0.18| 3697.264| 3697.264| 3737.1| 10.431| 0.229
答案 0 :(得分: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格式说明符转换为datetime。因为它是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