8
votes

Comment passer la valeur variable du système à l'instruction SQL dans la tâche SQL Execute SQL?

SSIS 2008. Tâche très simple. Je souhaite récupérer une variable système et l'utiliser dans un insert SQL. Je souhaite récupérer la valeur du système système: Machinename et utilisez-le dans une instruction insertion.

Utilisation de l'instruction Insérer dans Mylog (COL1) Sélectionnez @ [Système :: Machinename] Donne l'erreur ERREUR: ..Faillée à l'analyse. Doit déclarer la variable scalaire "@"

Utilisation des instructions Sélectionnez @System :: Machinename ou SELECT @@ [SYSTEM :: Machinename] Donne l'erreur 'ERROR ERROR '::'

Je n'essaie pas de passer un paramètre à la requête. J'ai déjà cherché une journée mais je n'ai pas trouvé comment faire cette chose simple!


0 commentaires

4 Réponses :


0
votes

Je ne l'utilise jamais avant, mais vous pouvez peut-être consulter l'utilisation de l'expression dans la tâche SQL pour cela.

ou simplement mettre la requête entière dans une expression d'une variable avec EvaluaeaseTexpression définie sur true. Ensuite, utilisez OLE DB pour insérer


1 commentaires

+1 C'est la bonne réponse IMHO. La question de l'OP est à peu près le cas d'utilisation des expressions de la propriété SSIS. Passer les variables SSIS dans la chaîne de requête, on le concaténerait dans une expression définie pour la propriété SQLSTATIMSOURCE ; "Insérer dans mylog (col1) Sélectionnez" + @ [System :: Machinename] . Cela ne veut pas suggérer que la réponse acceptée n'est pas un bon modèle.



16
votes

Voici une façon vous pouvez le faire. Le paquet exemple suivant a été créé en utilisant SSIS 2008 R2 et utilise SQL Server 2008 R2 en tant que back-end.

  • Créer une table échantillon dans votre base de données SQL Server nommée dbo.PackageData

    structure de table

    • Créer un package SSIS.
    • Sur le SSIS, ajoutez un gestionnaire de connexion OLE DB nommé SQLServer pour se connecter à votre base de données, par exemple à une base de données SQL Server.
    • Dans l'onglet Flux de contrôle, faites glisser et déposer un Exécuter la tâche SQL
    • Double-cliquez sur la tâche d'exécution SQL pour amener l'exécution éditeur de tâches SQL.
    • Sur le Général de l'éditeur, définissez le Connexion à votre gestionnaire de connexion nommée SQLServer.
    • Dans la propriété SQLStatement , entrez l'instruction d'insertion INSERT INTO dbo.PackageData (PackageName) (?)

      Général

      • Dans l'onglet Paramètre Mapping, cliquez sur le bouton Ajouter, sélectionnez la variable package que vous souhaitez utiliser. Modifier le type de données en conséquence. Cet exemple va insérer le PackageName dans une table, de sorte que le Type de données serait VARCHAR . Réglez le Paramètre Nom 0 , qui indique la valeur d'index du paramètre. Cliquez sur le bouton OK.

        Paramètre Mapping onglet

        • Exécuter le package.
        • Vous remarquerez un nouvel enregistrement inséré dans la table. Je conservais le nom du package Package. Voilà pourquoi la table

          données Package

          L'espoir qui aide.


2 commentaires

Réponse parfaite et très bien présentée. J'avais essayé ce processus avant, et ça n'a jamais fonctionné. Mon 'erreur' définit «ByPassPrepare» à FALSE, puis utilisez «Query d'analyse», qui a toujours renvoyé un message d'erreur. Cadrage «Bypass préparez-vous» à vrai était le tour secret magique. Je soupçonnais que c'était quelque chose de simple et pas bien documenté. Merci beaucoup Siva! 4 étoiles et un visage souriant pour vous.


Je venais d'apprendre ce que signifie «point d'interrogation» et que cela a du sens. Merci pour cette solution approfondie. De plus, vos images sont cassées, alors je les ai supprimées. N'hésitez pas à les ajouter.



1
votes

par mon commentaire contre la réponse de @ zero (répété ici comme une réponse, il n'est donc pas négligé par les nouveaux arrivants SSIS).

La question de l'OP est à peu près le cas d'utilisation des expressions de la propriété SSIS.

Pour transmettre des variables SSIS dans la chaîne de requête, on le concaténerait dans une expression définie pour la propriété SQLSTATIMENTSOURCE:

"Insérer dans mylog (col1) Sélectionnez" + @ [System :: Machinename]

Cela ne veut pas suggérer que la réponse acceptée n'est pas un bon modèle, comme en général, l'approche paramétrée est plus sûre (contre l'injection SQL) et plus rapidement (sur la réutilisation) que la manipulation de chaîne de requête directe. Mais pour une variable système (par opposition à une chaîne entrée par l'utilisateur), cette solution doit être à l'abri de l'injection SQL, ce qui sera approximativement aussi rapide ou plus rapide qu'une requête paramétrée si réutilisée (comme le nom de la machine ne change pas. ).


0 commentaires

0
votes

Avec la réponse de @ user756519, en fonction de votre chaîne de connexion, de vos noms de variables et de vos modifications SQLSTATISSource

 https://docs.microsoft.com/en-us/sql/integration-services/control-flow/execute-sql-task


0 commentaires