2

我知道围绕这个主题还有其他主题,但它们并不像我的需求那么具体(到目前为止我可以找到)。

我有 csv 文件可以导入到我管理的 SQL Server 数据库中。它们是由人类组合在一起的,因此可能会出现列过多、数据类型不正确、标题损坏等错误。

我有一个 Web 表单,可以从用户接收文件到服务器上的目录,然后它将一行作为字符串读取,逐个单元格地解析它,并执行诸如检查正确的单元格计数是否存在之类的事情,然后移至下一行.

现在来验证数据类型和范围,我不清楚最好的方法。对数字类型进行手动范围检查之类的操作似乎有点过时。

有没有更好的办法?一些东西;

  1. 我有 SQL Server 类型,如“数字”,但也有 nvarchar。

  2. 这些文件可以小到几千字节,也可以大到超过一千兆字节。

  3. 我需要报告存在错误的每个特定行和列,而不仅仅是行 x 失败。

我想也许试图将单元格值转换/转换为预期的类型,捕获异常并将数据拆分为块并生成线程以并行进行检查?

提前致谢。

4

1 回答 1

1

我建议使用批量复制。SSIS 要复杂得多且容易出错(在正常情况下也慢得多......)。

通常,您知道您期望哪些列,并且您想为具有正确格式的导入数据创建一个“导入阶段表”。如果它不符合 TSQL 中的最低要求(列数)(在 bulc 插入周围带有“try/catch”),您可以拒绝整个文件。

可以在初始导入后进行转换和类型检查。为此,在阶段表中使用正确格式的附加列可能很有用。例如,您可以导入到 nvarchar 列并转换为十进制值。这里的技巧是使用视图:在视图下方的示例中,“myImportTable_InsertView”仅从阶段表中选择导入的列(阶段表有更多用于类型检查的列)

    DECLARE @SQLString nvarchar(4000) =

    INSERT dbo.myImportTable_InsertView
    FROM ''' + @FullFilename + ''' WITH
    (
    FIELDTERMINATOR = '';'',
    ROWTERMINATOR = ''\n'',
    CODEPAGE= ''RAW''
    )'
    Exec (@SQLString)

完成所有验证后,您只需将数据从阶段表复制到其最终目的地。

为了报告错误行,我通常在阶段表行上使用标志来标记不同类型的错误。

于 2013-02-20T10:18:08.540 回答