我知道围绕这个主题还有其他线索,但它们并不像我的需要那样具体(我到目前为止都能找到)。
我有csv文件导入我管理的SQL Server数据库。它们由人类组合在一起,因此可能会出现错误,例如列数太多,数据类型不正确,标题损坏等等。
我有一个Web表单,可以从用户接收文件到服务器上的目录,然后以字符串形式读取一行,逐个单元地解析它,并执行检查正确的单元格计数等操作,然后移动到下一行。
现在验证数据类型和范围,我不清楚最好的方法。像数字类型的手动范围检查这样的事情看起来有点过时了。
有更好的方法吗?一些事情;
我有SQL Server类型,如“numeric”,但也有nvarchar。
文件可以小到几千字节,也可以大到一千兆字节。
我需要报告存在错误的每个特定行和列,而不仅仅是行x失败。
我想可能尝试将单元格值转换/转换为预期类型,捕获异常并将数据拆分为块并生成线程以并行执行检查?
提前致谢。
答案 0 :(得分:1)
我建议使用bulc copy。 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)
完成所有验证后,您只需将舞台表中的数据复制到其最终目的地。
要报告错误行,我通常在舞台表行上使用标记来标记不同类型的错误。