使用SSIS或只是普通的T-SQL导入和验证XML文件?

时间:2011-08-26 10:41:07

标签: sql xml ssis xsd

在SQL Server中将XML文件导入并验证到单个表(展平)时,最佳做法是什么?

我有一个XML文件,其中包含大约15种复杂类型,这些类型都与单个父元素相关。 SSIS设计可能如下所示: 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之间是否存在任何性能差异。


请注意,其他一些要求是:

  1. 错误处理:如果出现错误,必须向某人发送电子邮件。
  2. 能够处理具有特定文件名模式的多个输入文件:XML_ {date} _ {time} .xml
  3. 将处理过的XML文件移动到其他文件夹。
  4. 请建议。

1 个答案:

答案 0 :(得分:6)

根据您提到的要求,我会说您可以充分利用这两个领域(T-SQL和SSIS)。

我觉得T-SQL在加载您在问题中描述的XML数据时提供了更大的灵活性。

有很多不同的方法可以实现这一目标。这是一个可能的选择:

  1. 创建一个存储过程,该过程将XML文件的路径作为输入参数。

  2. 使用您认为更容易的T-SQL方式执行XML数据加载操作。

  3. 使用SSIS包执行错误处理,文件处理,存档和发送电子邮件。

  4. 使用SSIS中提供的日志记录功能。它只需要简单的配置。以下是一个示例,说明如何在SSIS How to track status of rows successfully processed or failed in SSIS data flow task?

  5. 中配置日志记录
  6. 您的流程示例模拟将如下面的屏幕截图所示。使用Foreach循环容器循环文件。将文件路径作为参数传递给Execute SQL Task,然后执行SQL Task,调用您提到的T-SQL。处理完文件后,使用文件系统任务将文件移动到存档文件夹。

  7. SSIS reading multiple xml files from folder中使用的示例 演示了如何使用Foreach循环容器循环遍历文件。它循环遍历xml文件,但使用数据流任务,因为xml文件格式更简单。

  8. How to send the records from a table in an e-mail body using SSIS package?中使用的示例显示了如何使用“发送邮件任务”发送电子邮件。

  9. How do I move files to an archive folder after the files have been processed?中使用的示例显示了如何将文件移动到存档文件夹。

  10. Branching after a file system task in SSIS without failing the package中使用的示例显示了即使在特定任务失败后如何继续执行包。这将帮助您继续执行包执行,即使Foreach循环失败,您也可以发送电子邮件。屏幕截图中的蓝色箭头表示完成上一个任务。

  11. How do I pick the most recently created folder using Foreach loop container in SSIS package?中使用的示例显示了如何执行模式匹配。

  12. 希望能给你一个想法。

    Flow