Package SSIS avec variable user dans la clause Where

Autrement dit, j'essaie de saisir datatables de l'user, de les stocker dans une variable, puis d'utiliser cette variable dans une requête.

Tout d'abord, j'ai une tâche de script qui ouvre une window avec une textbox de saisie simple et un button. Au clic, le text est placé dans une variable user et une boîte de message apparaît pour afficher ce qui est dans la variable user. Cliquer sur OK dans la boîte de message ferme à la fois la boîte de message et la window d'origine. Cela semble fonctionner correctement.

Ensuite, j'ai une tâche SQL d'exécution. Les parameters sont les suivants:

Général

  • ResultSet = Aucun
  • ConectionType = OLE DB
  • login = localhost.DB
  • SQLSourceType = Entrée directe
  • SQLStatement = [Code SQL affiché ci-dessous]

Paramétrage

  • Nom de la variable = User :: VarName
  • Direction = Entrée
  • DataType = VARCHAR
  • Nom du paramètre = 0
  • Taille du paramètre = 65535

Ensemble de résultats – N / A

Expressions – N / A

[CODE SQL]

if object_id('TEST.dbo.TEST','U') is not null drop table TEST.dbo.TEST; SELECT coalesce(FSC.a, format(cast(SVY.b as int),'000')) as ab, SVY.c, PP.d, SV1.e, PP.f, PP.g, cast(PP.g as float) AS g, SV1.h, SV1.i, SVY.j, SVY.k, format(cast(SVY.l as int), '00000') as l, CAST(SVY.m AS float) AS m, SVY.n, SV1.o, SVY.p, cast(PID.q as float) as q, cast(PID.r as float) as r, cast(PID.s as float) as s, cast(PID.t as float) as t, PID.u as u, PID.v as v, PP.w, CAL_B.x as x, CAL_B.y as y, CAL_B.z as z, CAL_R.aa as aa, CAL_R.bb as bb, CAL_R.cc as cc into TEST.dbo.TEST FROM AAA.dbo.AAA PP INNER JOIN BBB.dbo.BBB PPC ON PP.x = PPC.x AND cast(PP.x as date) = cast(PPC.x as date) RIGHT OUTER JOIN CCC.dbo.CCC SVY ON PPC.x = SVY.x AND cast(PPC.x as date) = cast(SVY.x as date) LEFT OUTER JOIN DDD.dbo.DDD FSC ON SVY.x = FSC.x AND cast(SVY.x as date) = cast(FSC.x as date) LEFT OUTER JOIN EEE.dbo.EEE SV1 ON SVY.x = SV1.x AND SVY.x = SV1.x AND SVY.x = SV1.x AND SVY.x = SV1.x AND cast(SVY.x as date) = cast(SV1.x as date) AND PPC.x = SV1.x AND cast(PPC.x as date) = cast(SV1.x as date) INNER JOIN FFF.dbo.FFF RLS ON SV1.x = RLS.x AND SV1.x = RLS.x AND cast(SV1.x as date) = cast(RLS.x as date) AND SVY.x = RLS.x AND SVY.x = RLS.x AND SVY.x = RLS.x AND cast(SVY.x as date) = cast(RLS.x as date) LEFT OUTER JOIN GGG.dbo.GGG PID ON PP.x = PID.x AND coalesce(FSC.x, format(cast(SVY.x as int),'000')) = PID.x LEFT OUTER JOIN HHH.dbo.HHH CAL_B ON cast('20' + SUBSTRING(RLS.x,4,2) + '-' + SUBSTRING(RLS.x,6,2) + '-' + SUBSTRING(RLS.x,8,2) as date) = CAL_B.x AND CAL_B.x = 1 LEFT OUTER JOIN III.dbo.III CAL_R ON cast('20' + SUBSTRING(RLS.x,4,2) + '-' + SUBSTRING(RLS.x,6,2) + '-' + SUBSTRING(RLS.x,8,2) as date) = CAL_R.x AND CAL_R.x = 1 where cast(SVY.x as date) = (select cast(max(x) as date) from JJJ.dbo.JJJ) and PP.x is not null and SVY.x in ( ? ) 

LE PROBLÈME: Je cours le package. La zone de saisie de text s'ouvre. Je mets dans mon text, "'CN05', 'CN06'" (sans guillemets), je clique sur OK. Box apparaît montrant ma consortingbution. Je clique sur OK. Le stream de travail passe à l'exécution de la tâche SQL. En 1 seconde, la tâche se termine par un contrôle vert, sans erreurs. Je vérifie que TEST.dbo.TEST a été créé mais il est vide. Maintenant, si je cours le code ci-dessus dans le encoding SSMS le dernier bit [… SVY.x dans ('CN05', 'CN06')], je retire plus de 5 millions d'loggings en environ 4 minutes. Je suis perplexe quant à la raison pour laquelle cela ne fonctionne pas dans SSIS. Des idées là-bas?

En général, les clauses WHERE IN paramétrées ne sont pas sympa . Ils ne fonctionnent jamais comme nous le pensons. Au lieu de cela, vous pouvez utiliser la version de SQL dynamic de SSIS pour get la même chose. Créez une variable de string pour stocker la concaténation de votre instruction SQL plus grande avec votre input user. Ensuite, câblez votre tâche SQL d'exécution pour utiliser cette variable.

Par exemple, créez une nouvelle variable de string SSIS appelée SqlStatement . Dans la window des propriétés de la variable, ouvrez la window du générateur d'expression en cliquant sur les ellipses. Utilisez ce générateur d'expression pour concaténer votre SQL avec l'input user. Échantillon ci-dessous …

entrez la description de l'image ici

Veillez à définir la propriété EvaluateAsExpression de la variable sur True .

entrez la description de l'image ici

Enfin, modifiez votre tâche d'exécution SQL depuis l'input directe vers la variable et select cette variable comme source.

Chose.

Tout set. Votre tâche d'exécution SQL doit maintenant être câblée pour utiliser le SQL dynamic que vous avez construit dans le générateur d'expression. Bonne chance!