Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 在通过SSIS上载之前验证数据_Sql Server 2005_Excel_Ssis_Upload - Fatal编程技术网

Sql server 2005 在通过SSIS上载之前验证数据

Sql server 2005 在通过SSIS上载之前验证数据,sql-server-2005,excel,ssis,upload,Sql Server 2005,Excel,Ssis,Upload,我有一个SSIS包,可以将数据从Excel文件上载到SQLServer2005表中 excel文件将包含从20k到30k行的不同数据行 当所有数据都正确时,上传工作正常。但当出现小问题时,即使是在一行中,也显然失败了。例如,强制值表示为null、不可转换值(数据类型不匹配)等 我想在上传之前验证excel文件,并告诉用户哪一行和哪一列出现了错误 关于如何做到这一点的任何想法,而不需要花费太多的时间和资源 多谢将其加载到没有任何强制值的临时表中,并在将其附加到主表之前进行检查可能是最简单的 编辑再

我有一个SSIS包,可以将数据从Excel文件上载到SQLServer2005表中

excel文件将包含从20k到30k行的不同数据行

当所有数据都正确时,上传工作正常。但当出现小问题时,即使是在一行中,也显然失败了。例如,强制值表示为null、不可转换值(数据类型不匹配)等

我想在上传之前验证excel文件,并告诉用户哪一行和哪一列出现了错误

关于如何做到这一点的任何想法,而不需要花费太多的时间和资源


多谢将其加载到没有任何强制值的临时表中,并在将其附加到主表之前进行检查可能是最简单的

编辑再评论

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset 

''This is not necessarily the best way to get the workbook name
''that you need
strFile = Workbooks(1).FullName

''Note that if HDR=No, F1,F2 etc are used for column names,
''if HDR=Yes, the names in the first row of the range
''can be used. 
''This is the Jet 4 connection string, you can get more
''here : http://www.connectionstrings.com/excel

 strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

''Note that HDR=Yes
''Pick one:
strSQL = "SELECT Frst, Secnd FROM TheRange WHERE SomeField Is Null" ''Named range
strSQL = "SELECT Frst, Secnd FROM [Sheet1$C3:C67] WHERE Val(Secnd)=0" ''Range
strSQL = "SELECT Frst, Secnd FROM [Sheet1$] WHERE First<Date()" ''Sheet

rs.Open strSQL, cn

Sheets("Sheet2").Cells(2, 1).CopyFromRecordset rs
Dim cn作为ADODB.Connection
将rs设置为ADODB.Recordset
''这不一定是获取工作簿名称的最佳方式
“你需要的
strFile=工作簿(1).全名
''注意,如果HDR=No,则F1、F2等用于列名,
''如果HDR=是,则范围第一行中的名称
''可以使用。
''这是Jet 4连接字符串,您可以获得更多
“这里:http://www.connectionstrings.com/excel
strCon=“Provider=Microsoft.Jet.OLEDB.4.0;数据源=”&strFile_
&“扩展属性=”“Excel 8.0;HDR=Yes;IMEX=1”“
Set cn=CreateObject(“ADODB.Connection”)
Set rs=CreateObject(“ADODB.Recordset”)
cn.开放式strCon
''注意HDR=是
“选一个:
strSQL=“从SomeField为Null的范围中选择第一个、第二个”命名范围
strSQL=“从[Sheet1$C3:C67]中选择第一、第二张,其中Val(Secnd)=0”范围

strSQL=“从[Sheet1$]中选择Frst,Secnd,其中First我最近在SSIS中处理了许多类似的软件包,我唯一能够解决这个问题的方法是有一个类似的建议保留表


这个表非常通用,其中所有字段都是
NULL
able和
VARCHAR(255)
。然后,我有一个验证存储过程,在我将数据移动到“活动”中之前,它会检查输入、数据存在等情况“情况。虽然它可能不是最优雅的解决方案,但它让您可以控制检查数据的方式,也意味着您不必担心先将文件转换为.CSV。

事实上,我也在做同样的事情。但是数据类型转换问题和范围转换问题发生在上载到临时表本身的过程中。您是否尝试过写入CSV然后导入?如果您希望用户进行更正,那么ADO如何?如果数字字段中有charecter值。。将其写入CSV将解决问题。。或者我遗漏了什么。我不知道如何与ADO合作。。。请提供一些参考资料。如果数字字段中有字符值,则对于任何字段中不需要数字或日期或任何特定数据类型的临时表来说,这应该不是问题。我将在ADO上发布一些注释。好的。。我从未想到所有字段都要设置为varchar(255)。。。