2017-10-20 107 views
0

我创建进口10个不同的CSV文件的SSIS包随身携带,但是每个文件的可用性不尽相同 - 所以我想要得到的文件检查循环,直到所有的文件在那里,然后开始导入过程。SSIS For循环 - 等待文件上

我检查这个通过T-SQL脚本

IF OBJECT_ID('tblFileCheck') IS NOT NULL 
     DROP TABLE tbFileCheck; 

CREATE TABLE tblFileCheck (
     id int IDENTITY(1,1) 
     ,subdirectory nvarchar(512) 
     ,depth int 
     ,isfile bit); 

INSERT tblFileCheck 
EXEC xp_dirtree '\\reports\Reports\CSV', 10, 1 

BEGIN 
IF EXISTS (
SELECT COUNT(id) 
    FROM tblFileCheck 
    HAVING count(id) > 9 
) 
BEGIN 
PRINT 'Success - Import Latest File' 
END 
ELSE 
BEGIN 
    RAISERROR ('Looping back to start - insufficient files to run', 16, 1); 
END 
END 

但是我不能让循环工作,我创建了一个变量varWaitForData(INT32,VAL = 0),创建一个SQL任务编辑器result set = single row并将结果集选项设置为该参数。 设置InitExpression @varWaitForData = 0EvalExpression @varWaitForData == 0

,但我不断收到错误[Execute SQL Task] Error: An error occurred while assigning a value to variable "varWaitForData": "Exception from HRESULT: 0xC0015005".

+0

当你运行你的执行SQL任务,什么是它的结果的查询? –

回答

0

我会用不同的方法:

成立了一家名为fileCount变量INT

脚本任务:获取文件数

System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo("\\reports\Reports\CSV"); 
Dts.Variables["User::fileCount"].Value = dir.GetFiles().Length; 

现在成立了一个foreach文件枚举 ,把一个约束的路径上fileCount> 9

+0

其实你不能使用foreach,如果csv文件不同。您可以使用容器,但通过保持每个数据流来获得并行执行。 – KeithL