.net Excel与XML在数据上传上的比较

.net Excel与XML在数据上传上的比较,.net,xml,sql-server-2005,excel,ssis,.net,Xml,Sql Server 2005,Excel,Ssis,我正在尝试将Excel(2003)文件上载到SQLServer2005 目前,我们正在使用SSI将文件上载到一个临时表(具有已定义的模式),然后使用存储过程将数据移动到其预期位置。由于数据类型不匹配,这会导致很多错误,有时即使excel文件包含值,也会将空值上载到表中 现在我有以下选择 选项1:(建议) 将数据导入一个表中,表中所有列的类型都为varchar(255)。然后让SP验证每个列的数据类型,然后再将其移动到live。。。在这里,使用IsNumeric、len、IsDate等是否会造成性

我正在尝试将Excel(2003)文件上载到SQLServer2005

目前,我们正在使用SSI将文件上载到一个临时表(具有已定义的模式),然后使用存储过程将数据移动到其预期位置。由于数据类型不匹配,这会导致很多错误,有时即使excel文件包含值,也会将空值上载到表中

现在我有以下选择

选项1:(建议)

将数据导入一个表中,表中所有列的类型都为varchar(255)。然后让SP验证每个列的数据类型,然后再将其移动到live。。。在这里,使用IsNumeric、len、IsDate等是否会造成性能问题

选项2:(XML/XSD)

在通过.NET或SSIS导入XML之前,从XL文件生成XML并根据预定义的XSD对其进行验证。与选项1相比,这种方式会慢吗?我也能验证数据的长度吗?我是否能够准确报告导致错误的行和列

从你的观点来看,这在性能和其他方面都很好。。。特别是当出现错误时,我应该能够准确地向用户报告导致错误的行和列

如果有更好的方法处理此问题。。。请让我知道…


谢谢

请务必将验证与导入分开。就我个人而言,我会使用MS Access进行验证,因为它比SQL Server更容易解决Excel的数据存储问题,但如果需要,可以使用SQL Server上包含所有varchar(255)字段的表

导入很简单,验证本身就是一个项目


数据可能会在很多方面通过验证测试,每种方式都需要自己的自定义代码。

我个人使用前一种方法,导入到一个“无模式”的预暂存表中,然后进行数据清理,将好的行推到一个“适当”的暂存表中(使用与列的预期数据类型匹配的模式)并将坏行移动到与预暂存表匹配的异常表中,并添加一列描述验证失败的列(文本描述,或者,如果您真的想将其规范化,则使用相关错误表的错误代码)。

尽管前两个答案完全有效,但我的方法没有什么不同,因此我想在这里提供一条道路

步骤1:我使用Excel宏从Excel生成了一个Xml文件

第2步:在.NET(Windows应用程序)中使用预定义的XSD对其进行验证。XSD包含所有模式信息,如数据类型,甚至包括所需数据的长度、比例和精度

这里的另一个优点是,我可以显示验证失败的精确行和列,以便用户可以轻松地更正它

步骤3:使用SSIS将XML文件上载到一个表中,该表符合给定的模式

到目前为止,我发现的缺点是:

  • 由于涉及更多操作,上载过程稍慢
  • 即使更改单个字段的数据类型和长度也需要上传3个位置。(架构中1个,SSIS中2个,上传表中3个)
  • 这是我第一次尝试这个。到目前为止,它运行良好,我能够实现我想要的。随着时间的推移,可能会出现其他缺点。当我遇到一些问题时,我会努力更新这篇文章


    感谢您的帮助。

    旁注:IsNumeric很少是任何问题的正确答案,除非该问题是“此值是否可转换为任何数字类型?我不在乎哪种类型?”。因此,如果1d50和3.5这两个值都是您可以接受的,请使用它。谢谢您的旁注。。。那么,如果我需要验证int、Decimal、smallint等,我应该使用什么呢?例如,对于int,希望您在比“所有int值”更受约束的域中工作。假设您想要最多6位正数。检查是否有类似的表达式,例如类似于“[0-9][0-9][0-9][0-9][0-9][0-9][0-9]”的列。如果您还可以将您正在寻找的数据类型传递给IsNumeric,那么IsNumeric将非常有用,但遗憾的是,事实并非如此。