IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

problème avec sp_executesql [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut problème avec sp_executesql
    Bonjour,
    Quand je regarde le site de miscrosoft (http://msdn.microsoft.com/fr-fr/libr...ql.105%29.aspx), il donne ceci comme example d'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE @IntVariable INT;
    DECLARE @SQLString NVARCHAR(500);
    DECLARE @ParmDefinition NVARCHAR(500);
     
    /* Build the SQL string one time. */
    SET @SQLString =
         N'SELECT * FROM AdventureWorks2008R2.Sales.Store WHERE SalesPersonID = @SalesID';
    /* Specify the parameter format one time. */
    SET @ParmDefinition = N'@SalesID int';
     
    /* Execute the string with the first parameter value. */
    SET @IntVariable = 275;
    EXECUTE sp_executesql @SQLString, @ParmDefinition,
                          @SalesID = @IntVariable;
    Moi j'ai besoin d'avoir un varchar comme variable, j'ai donc adapté le code pour avoir ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    declare @SqlString nvarchar(500);
    declare @ParmDefinition nvarchar(500);
    declare @NVarCharVariable nvarchar(500);
    set @SqlString = N'select * from [@ServerName].[thenameofmydb].[dbo].Currency';
    set @ParmDefinition = N'@ServerName nvarchar(500)';
    set @NVarCharVariable = N'thenameofmyserver';
    EXECUTE sp_executesql @SqlString, @ParmDefinition,
    					  @ServerName = @NVarCharVariable;
    Mais j'ai l'erreur suivante :
    Msg 7202, Level 11, State 2, Line 1
    Could not find server '@ServerName' in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.
    Il n'a donc pas remplacé @ServerName par le nom de mon serveur 'thenameofmyserver'... Qu'est-ce que je ne fais pas correctement s'il vous plaît? Et au passage, est-ce qu'il n'y a pas plus simple pour exécuter une requête sql avec une variable de type varchar dedans?
    D'avance merci pour vos retours,
    Julien

  2. #2
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Bonjour,
    votre instance sql ne connait le serveur auquel vous essayez d’accéder.
    "sp_addlinkedserver" pour ajouter un serveur "lié".

    Si le code doit s'exécuter sur le meme serveur, vous n'êtes pas obligé de le préciser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @SqlString = N'select * from [thenameofmydb].[dbo].Currency';

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    La méthode que vous voulez utiliser permet de spécifier des paramètres de votre requête(Afin de faciliter la réutilisation des plans d'éxécution), et non pas les noms des objets (ici le nom d'un serveur)

    Il vous faut donc construire la chaine directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET @SqlString = N'select * from [' + @NomDuServeur + '].[thenameofmydb].[dbo].Currency';

  4. #4
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Citation Envoyé par dkmix Voir le message
    Bonjour,
    votre instance sql ne connait le serveur auquel vous essayez d’accéder.
    "sp_addlinkedserver" pour ajouter un serveur "lié".

    Si le code doit s'exécuter sur le meme serveur, vous n'êtes pas obligé de le préciser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @SqlString = N'select * from [thenameofmydb].[dbo].Currency';
    Non ce n'est pas ce problème car le serveur 'thenameofmyserver' est bien connu depuis le serveur à partir duquel j'exécute ma requête. L'erreur me dit qu'il ne connaît pas '@ServerName', qui est le nom de la variable de mon serveur distant et non le contenu de ma variable.

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    La méthode que vous voulez utiliser permet de spécifier des paramètres de votre requête(Afin de faciliter la réutilisation des plans d'éxécution), et non pas les noms des objets (ici le nom d'un serveur)

    Il vous faut donc construire la chaine directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET @SqlString = N'select * from [' + @NomDuServeur + '].[thenameofmydb].[dbo].Currency';
    Je n'avais pas saisi que sp_executesql ne fonctionnait que pour des paramètres au sein de la requête sql, je pensais que je pouvais remplacer n'importe quelle partie de ma @SqlString. Ce que vous proposez est en fait ce que je pensais faire au début, sans passer du coup par sp_executesql, mais dans ce cas si je fais un simple execute sur ma string comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    declare @SqlString varchar
    declare @ServerName varchar
    set @ServerName = 'thenameofmyserver';
    SET @SqlString = 'select * from [' + @ServerName + '].[thenameofmydb].[dbo].Currency';
    EXECUTE @SqlString;
    J'obtiens l'erreur suivante :
    Msg 2812, Level 16, State 62, Line 6
    Could not find stored procedure 's'.

  6. #6
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Oh, j'ai trouvé, il faut éxécuter le code ci-dessous en fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    declare @SqlString nvarchar(500)
    declare @ServerName nvarchar(500)
    SET @ServerName = N'thenameofmyserver';
    SET @SqlString = N'select * from [' + @ServerName + N'].[thenameofmydb].[dbo].Currency';
    EXECUTE sp_executesql @SqlString;
    Par contre c'est bizarre car si je ne spécifie pas une longueur à mes nvarchar, j'ai le même message d'erreur que précédemment...

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    normal, vous ne précisez pas de longueur pour @SqlString, donc celle-ci est de 1 par défaut.
    La chaine que vous exécutez est donc
    et forcément, ça marche beaucoup moins bien

  8. #8
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    C'est effectivement ce que je me suis dit. J'imaginais que les nvarchar et les varchar fonctionnaient de la même manière. En effet quand je déclare un varchar sans lui préciser de longueur il aura par défaut une longueur de 1, par contre si je lui affecte une chaine de longueur 50, il fera alors exactement 50 de long, c'est la partie variable de varchar justement. Je suis donc étonné qu'il n'en soit pas de même pour le nvarchar.

    [Edit]
    Autant pour moi, j'ai tout faux, j'ai testé ce que je viens de dire (ce que j'aurais dû faire avant de poster...) et ça ne marche pas donc même pour les varchar. Merci bien. Par contre, à quoi sert de mettre le N devant les chaînes de caractère?

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par jmclej Voir le message
    Par contre, à quoi sert de mettre le N devant les chaînes de caractère?
    A spécifier que les chaines sont au format Unicode

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec sp_executesql
    Par Dschub dans le forum Développement
    Réponses: 4
    Dernier message: 06/05/2009, 15h42
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo