Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/10/2011, 15h36   #1
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Par défaut SSIS : ListeTables paramétrable

Bonjour,

J'aimerais dans un lot SSIS (SQL Server 2008 R2) pouvoir paramétrer la propriété TablesList dans un "Transfert d'objet SQL Server". En effet, je ne connais pas à l'avance la structure des tables à transférer et je ne peux pas faire de SELECT * INTO ... car la destination est un serveur lié chez mon hébergeur. (Et je ne peux pas, depuis l'hébergeur, créer un serveur lié vers mon serveur)
J'ai essayé de stocker dans une variable la liste des tables à transférer, mais rien n'y fait.
En cherchant sur le net je n'ai trouvé que des astuces consistant à passer par un script ActiveX pour modifier dynamiquement TablesList... N'y-a-t'il pas plus simple ?

En vous remerciant par avance.

Adrien
sqlabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 16h14   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
En passant dynamiquement la valeur de TableList via les expressions sur la tache de transfert d'objet?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 16h15   #3
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Qu'avez vous tenté de faire avec la variable?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 16h57   #4
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Merci de prendre le temps... ;-)

Pour simplifié, je ne vais pas tenter une liste de table mais simplement une table à la fois (au pire je mettrais le tout dans un ForEach).

Je stock donc dans une variable [NOMTABLE] (dont l'entendue est le package entier) de type string le nom de la table à transférer.

Ensuite, dans l'éditeur de tâche de Transfert d'objet, dans la partie Expressions, je renseigne l'expression TablesList avec la variable @[User::NOMTABLE]

A l'éxécution, j'obtiens le message suivant :
Citation:
"Des erreurs récupérables se sont produites pendant l'enregistrement du package : Erreur sur tache de transfert d'objet SQL Server : Le résultat de l'expression «*@[User::NOMTABLE] *» sur la propriété «*TablesList*» ne peut pas être écrit dans la propriété. L'expression a été évaluée, mais ne peut pas être définie sur la propriété.
merci encore pour votre aide.

Cdlt,
sqlabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 19h37   #5
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Ok... avez vous mis delayvalidaton à true sur la tache?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 11h15   #6
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Bonjour,

Je l'avais fait sur le Package mais pas sur le tâche. Je viens d'essayer, mais le problème reste le même :

Erreur*: Le résultat de l'expression «*@[User::NOMTABLE]*» sur la propriété «*TablesList*» ne peut pas être écrit dans la propriété. L'expression a été évaluée, mais ne peut pas être définie sur la propriété.

J'ai aussi essayé en mettant dbo.matable dans ma variable.... idem.

J'ai l'impression que le format string de la variable ne convient pas à la propriété...

Merci
sqlabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 11h52   #7
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Thanks Phil. I had read through that article as well, but I was hoping there was an easier way to do it through the expression builder.

I had also sent an e-mail off to Jamie Thomson from SSIS Junkies and the reply that he sent states that you cannot set a collection property through an expression.

So it appears that the only way to do this is to use a script task.

Thanks.



John Rowan
Je suis tombé sur cette discussion...
avec vous essayé avec une variable de type object?

Mais je doutes que ça fonctionne...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 14h10   #8
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Je doute que cela fonctionne, mais de toute façon, je n'arrive pas à tester cela car si je met ma variable en type Objet, je n'arrive plus à lui attribuer une valeur.

Je vais fouiller un peu + sur les sites anglophones, si je trouve une solution, je viendrai bien sûr la poster ici.

cdlt,
sqlabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 14h46   #9
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Je doute que cela fonctionne, mais de toute façon, je n'arrive pas à tester cela car si je met ma variable en type Objet, je n'arrive plus à lui attribuer une valeur.
Il faut passer par un script .NET et caster votre object en String[]
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 12h11   #10
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Après plusieurs tests et recherches, j'ai fini par y arriver. Voici comment j'ai procédé :

1- Création du package [UPLOAD_EXTRACTION_PREPROD.dtsx] de transfert avec toutes le connexions enregistrées dans un fichier de configuration (fait en passant par le menu SSIS -> Configuration de Package)
2- Création d'un objet "Transfert d'objet SQL" [movetables] dans lequel les serveurs sources et cibles sont correctement renseignés
3- Création d'un package [UPLOAD_EXTRACTION_PREPROD_CALL.dtsx]
4- Ajout d'une tache de script dans ce package dont le code est ci-dessous

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 public void Main()
        {
           Microsoft.SqlServer.Dts.Runtime.Application application = new Microsoft.SqlServer.Dts.Runtime.Application();
           //object packagename = Dts.Connections["Tables"].AcquireConnection(NULL);
 
           string packagename = @"\\SERVEUR1\SSIS\UPLOAD_EXTRACTION_PREPROD.dtsx";
           Microsoft.SqlServer.Dts.Runtime.Package package = application.LoadPackage(packagename.ToString(), NULL);
 
           TaskHost th = package.Executables["movetables"] AS TaskHost;
 
           System.Collections.Specialized.StringCollection sc = new System.Collections.Specialized.StringCollection();
           sc.ADD("TABLE_201110031547_ID376");
           th.Properties["TablesList"].SetValue(th, sc);
           Dts.TaskResult = (int)package.Execute();
 
 
           //Dts.TaskResult = (int)ScriptResults.Success;
Exécution du Package [UPLOAD_EXTRACTION_PREPROD_CALL.dtsx]

En ce qui me concerne, ça fonctionne, je n'ai plus qu'à passer en paramètre la ou les tables que je veux transférer et à faire référence à ce paramètre dans le script à la place de "TABLE_201110031547_ID376".

Les critiques et commentaires sont les bienvenus s'il y a mieux ;-)
sqlabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h29.


 
 
 
 
Partenaires

Hébergement Web