2017-10-20 14 views
0

Je crée un paquet SSIS qui importe 10 fichiers CSV différents, mais la disponibilité de chaque fichier varie - je veux donc faire en sorte que la vérification du fichier tourne jusqu'à ce que tous les fichiers soient là et puis commencez à importer le processus.SSIS For Loop - Attendre que le fichier continue

Je vérifie ce via un script 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 

Cependant, je ne peux pas obtenir la boucle de travailler, j'ai créé une varWaitForData variable (int32, val = 0), a créé un éditeur de tâches SQL avec result set = single row et définissez l'option de jeu de résultats sur le paramètre. Définissez InitExpression @varWaitForData = 0 et EvalExpression @varWaitForData == 0.

Mais je continue à obtenir l'erreur [Execute SQL Task] Error: An error occurred while assigning a value to variable "varWaitForData": "Exception from HRESULT: 0xC0015005".

+0

Lorsque vous exécutez la requête de votre tâche SQL d'exécution, quel est son résultat? –

Répondre

0

J'utiliser une approche différente:

mis en place une variable appelée FileCount int

tâche de script

: Obtenir le nombre de fichiers

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

Maintenant, mettez en place un énumérateur de fichiers foreach et mettez une contrainte sur le chemin que fileCount> 9

+0

En fait, vous ne pouvez pas utiliser foreach si les fichiers csv sont différents. vous pouvez utiliser un conteneur en conservant chacun des flux de données pour obtenir une exécution parallèle. – KeithL