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 :

[2012] Stored Procedure avec sp_executesql


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 8
    Points
    8
    Par défaut [2012] Stored Procedure avec sp_executesql
    Bonjour bonjour,

    J'essaie de creer une procedure stockee dans une db A qui va executer une requete sur une db B. (Pour x raisons je dois proceder ainsi)
    J'utilise pour ca la commande dbo.sp_executesql precede du serveur et de la db a utilise.

    En cherchant un peu j'ai trouve deux facons de faire mais aucune ne marchent ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Create PROCEDURE TESTPROC
    (
    	@ShortName NVARCHAR(50)
    )
    AS
    Begin
    	Declare @sql NVARCHAR(1000)
    	SET @sql = N'Select * from emp where ShortName = ''@ShortName'' '
     
    	exec [serveur].[db].dbo.sp_executesql @ShortName, @sql
    END
    GO
    Ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ALTER PROCEDURE TESTPROC
    (
    	@ShortName VARCHAR(50)
    )
    AS
    Begin
     
    	exec [serveur].[db].dbo.sp_executesql 
    	N'Select * from emp where ShortName = ''@ShortName'' 
    	'
    END
    GO
    et j'execute ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXEC TESTPROC @ShortName = 'totot'
    Le probleme c'est que si je bidouille un peu soit SQL server me dit : Must declare the scalar variable "@ShortName".
    Soit ca me retourne une table vide. ( La requete marche sans le parametre, si je met une valeur en dure)

    Quelau'un saurait la raison de mon probleme ?

    Merci Beaucoup

  2. #2
    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,

    Est-ce que vous avez créé un serveur lié ?

    Vous pouvez faire votre requête directement comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM Serveur.[db].dbo.emp
    where ShortName = @ShortName
    (en spécifiant le nom de la table en quatre partie)


    Vous pouvez aussi faire comme ceci (peut être plus performant si votre requête porte sur plusieurs tables distantes, c'est le serveur distant qui compile et exécute la requête puis renvoi le résultat)


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ALTER PROCEDURE TESTPROC
    (
        @ShortName VARCHAR(50)
    )
    AS
    Begin
     
     
        EXEC ('Select * from [db].dbo.emp where ShortName = ''' + @ShortName + '''') AT Serveur 
     
     
    END
    GO

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Ah super ! J'ai essaye les deux, et les deux marchent !

    Et donc la deuxieme solution est meilleur en terme de performance ? Serait ce possible de savoir pourquoi ?

    J'ai passer un temps fou a chercher une solution et c'etait si simple

  4. #4
    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
    Avec une requête aussi simple, je pense qu'il n'y aura pas de différence.

    Par ailleurs, je vois que vous êtes en version 2012 qui corrige (me semble-t-il) un bug par rapport à ça : dans les anciennes versions, le serveur local ne pouvait pas toujours obtenir les statistiques sur les données distantes (pour des problèmes de droits), et ne pouvait donc pas générer un plan d’exécution adéquat.

    Donc personnellement, je préfère la solution avec les noms en quatre parties, je trouve cela plus lisible.

    Si votre requête se complique, notamment si vous faites des jointures entre plusieurs tables distantes et tables locales, il faudra peut être prévoir d'autres solutions. (vous pourriez aussi utiliser OPENQUERY...)

  5. #5
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Par ailleurs, je vois que vous êtes en version 2012 qui corrige (me semble-t-il) un bug par rapport à ça : dans les anciennes versions, le serveur local ne pouvait pas toujours obtenir les statistiques sur les données distantes (pour des problèmes de droits), et ne pouvait donc pas générer un plan d’exécution adéquat.
    Hello, c'est effectivement un problème de droit qui a été résolu avec SQL Server 2012. Depuis cette version si un utilisateur a le droit SELECT sur les objets concernés il peut aussi récupérer les informations de statistiques.

    La différence fondamentale entre OPENQUERY et les requêtes en 4 parties est que dans le premier cas la requête est exécutée localement sur le serveur lié (distant) et le résultat est ramené ensuite en local. Dans le 2ème cas les données sont ramenées en local avant d'être traitées. Dans certains cas il n'y a aucune différence mais dans d'autres cela peut être intéressant.

    Par exemple une requête qui effectue une jointure entre une table local A et une table distante B avec un prédicat sur la table distante B. Avec une requête distribuée en 4 parties il y a de grandes que l'ensemble de la table soit ramenée et puis filtrée en local. Avec OPENQUERY il est possible de demander au serveur distant de faire le travail et de ne ramener que les éléments qui nous intéressent.

    ++

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Tres bien ! Je vous remercie beaucoup pour votre aide et vos explications !


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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/07/2012, 09h06
  2. Réponses: 7
    Dernier message: 11/05/2009, 14h21
  3. Utiliser Enterprise Library avec Oracle Stored Procedure
    Par Cervantes dans le forum Accès aux données
    Réponses: 1
    Dernier message: 27/10/2008, 11h39
  4. [sql 200] Problème avec une stored procedure
    Par marc_dd dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 01/12/2006, 15h11
  5. Réponses: 5
    Dernier message: 11/07/2006, 15h54

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