6
votes

SQL Server Agent et packages SSIS

J'essaie de transmettre une valeur de variable du travail de l'Agent SQL Server au package SSIS, mais la variable contient une apostrophe provoquant l'échec du travail de l'Agent SQL Server

Par exemple, dans l'Agent SQL Server à l'étape du travail Propriétés I ' Je saisis les informations suivantes:

Property Path: \Package.Variables[User::VariableName].Properties[Value] Property 
Value: Michael O'Callaghan.

Avez-vous une idée de comment résoudre ce problème?


0 commentaires

5 Réponses :


5
votes

Si le package est déployé sur SSISDB et exécuté à partir de là, utilisez les procédures stockées SSISDB pour définir la valeur et échapper le guillemet comme vous le feriez via T-SQL. Le travail de l'agent SQL peut ensuite utiliser un script T-SQL pour cette étape à la place. L'exemple ci-dessous utilise la procédure stockée set_execution_parameter_value pour définir cette valeur et entraînera toujours la transmission de "Michael O'Callaghan".

DECLARE @execution_id BIGINT
EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx', @execution_id=@execution_id OUTPUT, 
@folder_name=N'Project Folder', @project_name=N'Project', @use32bitruntime=False, @reference_id=Null

DECLARE @var0 SQL_VARIANT = N'Michael O''Callaghan'
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=30, @parameter_name=N'Name', @parameter_value=@var0

DECLARE @var1 SMALLINT = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=@var1

EXEC [SSISDB].[catalog].[start_execution] @execution_id


4 commentaires

Pourquoi ne pas utiliser des variables d'environnement stockées?


Bon point @JWeezy, définir cela à partir d'une variable d'environnement fonctionnerait aussi.


@JWeezy il est bon d'ajouter ceci comme une autre réponse, donc l'OP a toutes les solutions possibles, ou vous pouvez modifier la réponse suivante et ajouter cette suggestion


@Hadi Conformément à votre recommandation, j'ai fourni une réponse distincte. Merci.



4
votes

Échappez-y. Utilisez simplement une double apostrophe. '' (Pas une citation ", mais une apostrophe apostrophe) .


0 commentaires

2
votes

Essayez la manière standard de gérer un fichier de configuration (si vous utilisez 2008 ou moins) et passez les valeurs des variables dans le fichier.


3 commentaires

Le mode de déploiement de projet SSIS a son propre mode de configuration moderne. Il n'utilise plus de fichiers de configuration


@AlexanderVolok que je suggérais pour la version 2008. J'ai modifié ma réponse.


vous avez vraiment raison. OP tente de configurer le package déployé en "mode package" ... J'ai été confus par les réponses qui utilisent le mode de déploiement de projet



1
votes

Une autre façon de gérer cela, et franchement je pense que la meilleure façon, est d'utiliser des variables d'environnement. À ma connaissance, cela a été introduit lorsque Microsoft a déployé le modèle de déploiement de projet avec SQL Server 2012 en remplacement du modèle de déploiement de package. Le modèle de déploiement de package exigeait que les paramètres de package soient spécifiés dans un fichier XML distinct à déployer sur le serveur. Avec le modèle de déploiement de projet, Microsoft a créé une interface utilisateur conviviale dans SQL Server pour gérer cela - le fichier XML a été supprimé.

En bref, les variables d'environnement permettent aux développeurs de lier des paramètres de package, mais pas des variables de package car ceux-ci sont internes au package lui-même , à SQL Server et ainsi les exposer sur le serveur. Cela rend la gestion des paramètres de package identiques qui existent dans les packages (par exemple, les gestionnaires de connexions, les emplacements de dossiers réseau au format FQDN, etc.) incroyablement facile à gérer. L'idée ici est que si les packages doivent être dirigés vers un nouveau serveur ou un nouveau dossier réseau, les développeurs peuvent simplement modifier une valeur unique dans SQL Server, qui se propagerait ensuite vers tous les packages sans le besoin pour ouvrir, modifier et redéployer le package.

Pour savoir comment procéder, consultez les références suivantes:

Microsoft: C'est un peu sec, mais complet et de la bouche du cheval.

SQL Chick: Plus intuitif et fournit des captures d'écran, ce que j'ai trouvé utile.


0 commentaires

1
votes

Merci pour toutes vos suggestions, mais malheureusement, elles n'ont pas fonctionné, mais j'ai créé une solution de contournement intelligente pour cela.

L'agent de serveur SQL enveloppe une valeur de variable entre guillemets simples, par exemple en spécifiant Jon Doe dans l'agent de serveur SQL, l'agent l'enveloppe comme ce 'Jon Doe' et le transmet au package SSIS, donc si vous deviez entrer une valeur avec un apostrophe, cela interromprait le travail de l'agent du serveur sql et n'exécuterait pas le package SSIS, cela ressemblerait à ce EG en passant cette valeur: `` John O 'Doe' 'cela provoquerait l'interruption du travail de l'agent, vous devez donc transmettre la valeur de votre variable comme: John O''Doe et l'agent l'enveloppe comme suit: 'John O' '' 'Doe', vous devrez donc inclure la logique suivante dans votre package SSIS:

Déclarer @TempVar nVarchar (50) SET @TempVar = REMPLACER (?, '' '' '', CHAR (39))

Le code ci-dessus crée une variable pour stocker la valeur du paramètre. Il remplace les 4 guillemets simples par un. CHAR (39) est la représentation ASCII d'un guillemet simple. Cela ferait alors ressembler la valeur de la variable à John O'Doe. J'espère que cela vous aidera.

La raison pour laquelle je voulais transmettre une valeur de variable de l'agent car je devais changer la valeur de la variable très souvent à partir du package SSIS, il aurait besoin d'être déployé à chaque fois. Donc, cette façon est plus rapide.


0 commentaires