在SQL Server中将XML文件导入并验证到单个表(展平)时,最佳做法是什么?
我有一个XML文件,其中包含大约15种复杂类型,这些类型都与单个父元素相关。 SSIS设计可能如下所示: 但是所有这些(15)连接都变得非常复杂。
将T-SQL代码写入以下内容可能是一个更好的主意:
1)将XML导入XML类型的列,并链接到XSD架构
2)使用此代码:
TRUNCATE TABLE XML_Import
INSERT INTO XML_Import(ImportDateTime, XmlData)
SELECT GETDATE(), XmlData
FROM
(
SELECT *
FROM OPENROWSET (BULK 'c:\XML-Data.xml', SINGLE_BLOB) AS XMLDATA
) AS FileImport (XMLDATA)
delete from dbo.UserFlat
INSERT INTO dbo.UserFlat
SELECT
user.value('(UserIdentifier)', 'varchar(8)') as UserIdentifier,
user.value('(Emailaddress)', 'varchar(70)') as Emailaddress,
businessaddress.value('(Fax)', 'varchar(70)') as Fax,
employment.value('(EmploymentData)', 'varchar(8)') as EmploymentData,
-- More values here ...
FROM
XML_Import CROSS APPLY
XmlData.nodes('//user') AS User(user) CROSS APPLY
user.nodes('BusinessAddress') AS BusinessAddress(businessaddress) CROSS APPLY
user.nodes('Employment') AS Employment(employment)
-- More 'joins' here ...
填写'UserFlat'表?
一些缺点是您必须手动键入SQLcode,但这里的优点是我可以更直接地控制元素的处理和转换方式。但我不知道在SSIS中处理XML和使用T-SQL XML语句处理XML之间是否存在任何性能差异。
请注意,其他一些要求是:
请建议。
答案 0 :(得分:6)
根据您提到的要求,我会说您可以充分利用这两个领域(T-SQL和SSIS)。
我觉得T-SQL在加载您在问题中描述的XML数据时提供了更大的灵活性。
有很多不同的方法可以实现这一目标。这是一个可能的选择:
创建一个存储过程,该过程将XML文件的路径作为输入参数。
使用您认为更容易的T-SQL方式执行XML数据加载操作。
使用SSIS包执行错误处理,文件处理,存档和发送电子邮件。
使用SSIS中提供的日志记录功能。它只需要简单的配置。以下是一个示例,说明如何在SSIS How to track status of rows successfully processed or failed in SSIS data flow task?
您的流程示例模拟将如下面的屏幕截图所示。使用Foreach循环容器循环文件。将文件路径作为参数传递给Execute SQL Task,然后执行SQL Task,调用您提到的T-SQL。处理完文件后,使用文件系统任务将文件移动到存档文件夹。
SSIS reading multiple xml files from folder中使用的示例 演示了如何使用Foreach循环容器循环遍历文件。它循环遍历xml文件,但使用数据流任务,因为xml文件格式更简单。
How to send the records from a table in an e-mail body using SSIS package?中使用的示例显示了如何使用“发送邮件任务”发送电子邮件。
How do I move files to an archive folder after the files have been processed?中使用的示例显示了如何将文件移动到存档文件夹。
Branching after a file system task in SSIS without failing the package中使用的示例显示了即使在特定任务失败后如何继续执行包。这将帮助您继续执行包执行,即使Foreach循环失败,您也可以发送电子邮件。屏幕截图中的蓝色箭头表示完成上一个任务。
How do I pick the most recently created folder using Foreach loop container in SSIS package?中使用的示例显示了如何执行模式匹配。
希望能给你一个想法。