Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment passer une valeur à un paramètre de procédure stockée dans le composant source OLE DB ?

Conceptuellement, votre solution ressemblera à une exécution de votre requête source pour générer votre jeu de résultats. Stockez cela dans une variable, puis vous devrez parcourir ces résultats et pour chaque ligne, vous voudrez appeler votre procédure stockée avec la valeur de cette ligne et envoyer les résultats dans un nouveau fichier Excel.

J'imagine que votre colis ressemble à ceci

Une tâche d'exécution SQL, nommée "SQL Load Recordset", attachée à un conteneur de boucle Foreach, nommé "FELC Shred Recordset". Niché à l'intérieur, j'ai une tâche de système de fichiers, nommée "FST Copy Template" qui est une priorité pour une tâche de flux de données, nommée "DFT Generate Output".

Configurer

Comme vous êtes débutant, je vais essayer d'expliquer en détail. Pour vous épargner des tracas, procurez-vous une copie de BIDSHelper. Il s'agit d'un outil open source gratuit qui améliore l'expérience de conception dans BIDS/SSDT.

Variables

Cliquez sur l'arrière-plan de votre flux de contrôle. Sans rien sélectionner, cliquez avec le bouton droit et sélectionnez Variables. Dans la nouvelle fenêtre qui apparaît, cliquez sur le bouton qui crée une nouvelle variable 4 fois. La raison de cliquer sur rien est que jusqu'à SQL Server 2012, le comportement par défaut de la création de variables est de les créer à la portée de l'objet actuel. Cela a entraîné la perte de nombreux cheveux pour les développeurs débutants et expérimentés. Les noms de variables sont sensibles à la casse, alors soyez-en conscient également.

  1. Renommer la variable en RecordSet. Changez le type de données de Int32 à Object
  2. Renommer Variable1 en ParameterValue. Modifiez le type de données de Int32 à String
  3. Renommer Variable2 en TemplateFile. Modifiez le type de données de Int32 à String. Définissez la valeur sur le chemin de votre fichier Excel de sortie. J'ai utilisé C:\ssisdata\ShredRecordset.xlsx
  4. Renommer la variable 4 en OutputFileName. Modifiez le type de données de Int32 à String. Ici, nous allons faire quelque chose de légèrement avancé. Cliquez sur la variable et appuyez sur F4 pour faire apparaître la fenêtre Propriétés. Remplacez la valeur de EvaluateAsExpression par True. Dans Expression, définissez-le sur "C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx" (ou quels que soient votre fichier et votre chemin). Ce que cela fait, c'est configurer une variable pour qu'elle change lorsque la valeur de ParameterValue change. Cela permet de garantir que nous obtenons un nom de fichier unique. Vous pouvez modifier la convention de dénomination si nécessaire. Notez que vous devez échapper le \ chaque fois que vous êtes dans une expression.

Gestionnaires de connexion

J'ai supposé que vous utilisiez un gestionnaire de connexions OLE DB. Le mien s'appelle FOO. Si vous utilisez ADO.NET, les concepts seront similaires mais il y aura des nuances concernant les paramètres et autres.

Vous aurez également besoin d'un deuxième gestionnaire de connexion pour gérer Excel. Si SSIS est capricieux sur les types de données, Excel est carrément psychotique-vous-poignarde-dans-le-dos-avec-une-fourchette-pendant-que-vous-dormez sur les types de données. Nous allons attendre et laisser le flux de données créer ce gestionnaire de connexion pour nous assurer que nos types sont bons.

Requête source vers l'ensemble de résultats

Le SQL Load Recordset est une instance de la tâche d'exécution SQL. Ici, j'ai une requête simple pour imiter votre source.

SELECT 'aq' AS parameterValue
UNION ALL SELECT 'dr'
UNION ALL SELECT 'tb'

Ce qu'il est important de noter dans l'onglet Général, c'est que j'ai changé mon ResultSet de None à Full result set . Cela fait passer l'onglet Ensemble de résultats de grisé à utilisable.

Vous pouvez observer que j'ai attribué le nom de la variable à la variable que nous avons créée ci-dessus (User ::RecordSet) et I le nom du résultat est 0 . C'est important car la valeur par défaut, NewResultName ne fonctionne pas.

Jeu d'enregistrements FELC Shred

Prenez un conteneur de boucle Foreach et nous l'utiliserons pour "déchiqueter" les résultats générés à l'étape précédente.

Configurez l'énumérateur en tant que Foreach ADO Enumerator Utilisez User::RecordSet comme variable de source d'objet ADO. Sélectionnez rows in the first table comme mode d'énumération

Dans l'onglet Variable Mappings, vous devrez sélectionner votre variable User::ParameterValue et affectez-lui l'index de 0. Cela se traduira par l'élément zéro dans votre objet de jeu d'enregistrements étant affecté à la variable ParameterValue. Il est important que vous ayez un accord sur le type de données car SSIS ne fera pas de conversions implicites ici.

Modèle de copie FST

Il s'agit d'une tâche de système de fichiers. Nous allons copier notre modèle de fichier Excel afin d'avoir un fichier de sortie bien nommé (contenant le nom du paramètre). Configurez-le comme

  • IsDestinationPathVariable :Vrai
  • Varible de destination :Utilisateur : :Nom du fichier de sortie
  • Remplacer la destination :Vrai
  • Opération :Copier le fichier
  • IsSourcePathVariable :Vrai
  • Variable Source :Utilisateur : :FichierModèle

DFT génère une sortie

Il s'agit d'une tâche de flux de données. Je suppose que vous ne faites que transférer les résultats directement dans un fichier, nous n'aurons donc besoin que d'une source OLE DB et d'une destination Excel

OLEDB dbo_storedProcedure1

C'est là que vos données sont extraites de votre système source avec le paramètre que nous avons détruit dans le flux de contrôle. Je vais écrire ma requête ici et utiliser le ? pour indiquer qu'il a un paramètre.

Changez votre mode d'accès aux données en "Commande SQL" et dans le texte de la commande SQL qui est disponible, mettez votre requête

EXECUTE dbo.storedProcedure1 ?

Je clique sur le bouton Paramètres... et le remplis comme indiqué

  • Paramètres :@parameterValue
  • Variables :Utilisateur : :ParameterValue
  • Direction des paramètres :entrée

Connectez une destination Excel à la source OLE DB. Double-cliquez et dans la section Excel Connection Manager, cliquez sur Nouveau... Déterminez si vous avez besoin du format 2003 ou 2007 (.xls vs .xlsx) et si vous voulez que votre fichier ait des lignes d'en-tête. Pour votre chemin de fichier, mettez la même valeur que vous avez utilisée pour votre variable @User::TemplatePath et cliquez sur OK.

Nous devons maintenant renseigner le nom de la feuille Excel. Cliquez sur ce bouton Nouveau... et il se peut qu'il n'y ait pas suffisamment d'informations sur le mappage des types de données. Ne vous inquiétez pas, c'est semi-standard. Il apparaîtra alors une définition de table quelque chose comme

CREATE TABLE `Excel Destination` (
    `name` NVARCHAR(35),
    `number` INT,
    `type` NVARCHAR(3),
    `low` INT,
    `high` INT,
    `status` INT
)

Le nom de la "table" va être le nom de la feuille de calcul, ou précisément, l'ensemble de données nommé dans la feuille de calcul. J'ai créé le mien Sheet1 et cliqué sur OK. Maintenant que la feuille existe, sélectionnez-la dans la liste déroulante. Je suis allé avec Sheet1$ comme nom de feuille cible. Je ne sais pas si cela fait une différence.

Cliquez sur l'onglet Mappages et les éléments devraient se mapper automatiquement, alors cliquez sur OK.

Enfin

À ce stade, si nous exécutions le package, il écraserait le fichier de modèle à chaque fois. Le secret est que nous devons dire que Excel Connection Manager nous venons de faire en sorte qu'il n'ait pas besoin d'avoir un nom codé en dur.

Cliquez une fois sur le gestionnaire de connexion Excel dans l'onglet Gestionnaires de connexion. Dans la fenêtre Propriétés, recherchez les Expressions section et cliquez sur les points de suspension ... Ici, nous allons configurer la propriété ExcelFilePath et l'expression que nous utiliserons est@[User::OutputFileName]

Si vos icônes et autres sont différentes, il faut s'y attendre. Cela a été documenté à l'aide de SSIS 2012. Votre flux de travail sera le même en 2005 et 2008/2008R2, seul le skin est différent.

Si vous exécutez ce package et qu'il ne démarre même pas et qu'il y a une erreur concernant ACE 12 ou Jet 4.0, quelque chose n'est pas disponible, alors vous êtes sur une machine 64 bits et devez dire à BIDS/SSDT que vous voulez exécuter en 32 bits mode.

Assurez-vous que la valeur Run64BitRuntime est False . Ce paramètre de projet peut être trouvé en cliquant avec le bouton droit sur le projet, développez les propriétés de configuration et ce sera une option sous Débogage.

Autres lectures

Un autre exemple de destruction d'un objet recordset peut être trouvé sur Comment automatiser l'exécution d'une procédure stockée avec un package SSIS ?