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 :

[TRANSACT] Base de données comme paramètre d'un curseur


Sujet :

Développement SQL Server

  1. #1
    En attente de confirmation mail

    Profil pro
    Inscrit en
    Février 2003
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 126
    Points : 127
    Points
    127
    Par défaut [TRANSACT] Base de données comme paramètre d'un curseur
    Bonjour à tous,

    petit problème dans l'utilisation des curseurs, en fait je cherche à créer un curseur indépendant de la base de données (là même requête est à jouer sur différentes DB ayant la même structure.

    Ce que je cherche à faire serait du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DECLARE @MyDB VARCHAR(255)
    SET @MyDB = 'MyDataBase'
    DECLARE MyCursor CURSOR
    FOR
         SELECT * 
         FROM @MyDB.Mytable
    Une idée SVP?

  2. #2
    En attente de confirmation mail

    Profil pro
    Inscrit en
    Février 2003
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 126
    Points : 127
    Points
    127
    Par défaut
    Pour l'instant je contourne en faisant référence à la DB avec un USE paramétré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE PROCEDURE [dbo].[UseDB] 
    	-- Add the parameters for the stored procedure here
    	@MyDB sysname
    AS
    BEGIN
    	DECLARE @SQL VARCHAR(255);
    	SET @SQL = 'USE ' + @MyDB;
    	EXEC (@SQL);
    END
    Puis je declare le curseur sans faire reference à la DB, juste à la table.

  3. #3
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Je dirais que ta solution de contournement met le doigt sur le point sensible : l'exécution dynamique avec des noms d'objets de base de données passés en variable.

    Si tu es sous SQL Server, tu dois faire toute la déclaration de ton curseur dynamiquement. J'ai vu cet exemple sur le net :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT @sql = 'DECLARE my_cur INSENSITIVE CURSOR FOR ' +
                  'SELECT col1, col2, col3 FROM ' + @table
    EXEC sp_executesql @sql

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Le script SQL doit être dans la chaîne @SQL, parce que le contexte d'exécution dans ce cas est distinct de celui de la procédure stockée ...

    @++

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Vous pouvez aussi inverser la vapeur en commençant par un USE dynamique. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE PROCEDURE listeTable @DB sysname
    AS
     
    DECLARE @SQL NVARCHAR(max)
    SET @SQL = 'USE ' + @DB+';'
    SET @SQL = @SQL + 'SELECT * FROM sys.database_files'
     
    EXEC (@SQL)
     
    GO
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Le script SQL doit être dans la chaîne @SQL, parce que le contexte d'exécution dans ce cas est distinct de celui de la procédure stockée ...

    @++
    Ouais, justement ils parlaient sur le site ou j'ai pompé l'exemple :
    You may be used to using the LOCAL keyword with your cursors. However, it is important to understand that you must use a global cursor, as a local cursor will disappear when the dynamic SQL exits. (Because, as you know by now, the dynamic SQL is its own scope.) Once you have declared the cursor in this way, you can use the cursor in a normal fashion. You must be extra careful with error-handling though, so that you don't exit the procedure without deallocating the cursor.
    Comme je connais rien à SQL Server, j'ai supposé que l'exemple correspondait à un global cursor...

    Bon mais maintenant qu'on en est là, je vous donne aussi la fin du paragraphe (que je ne cherche pas à comprendre, comme je ne suis pas sur SQL Server) :

    There is however a way to use locally-scoped cursors with dynamic SQL. Anthony Faull pointed out to me that you can achieve this with cursor variables, as in this example:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DECLARE @my_cur CURSOR
    EXEC sp_executesql
         N'SET @my_cur = CURSOR STATIC FOR
           SELECT name FROM dbo.sysobjects;
           OPEN @my_cur',
         N'@my_cur cursor OUTPUT', @my_cur OUTPUT
    FETCH NEXT FROM @my_cur
    You refer to a cursor variable, just like named cursors, but there is an @ in front, and, as you see from the example, you can pass them as a parameters. (I have to confess I have never seen any use for cursor variables until Anthony Faull was kind to send me this example.)
    http://www.sommarskog.se/dynamic_sql.html

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

Discussions similaires

  1. [Python 2.7] Base de données - INSERT paramètres variables
    Par kituse dans le forum Général Python
    Réponses: 3
    Dernier message: 25/05/2014, 16h28
  2. [Script SQL] Passage comme paramètre du nom de la base de données
    Par kha_yassine dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 08/11/2013, 17h45
  3. Réponses: 3
    Dernier message: 13/04/2011, 10h50
  4. Base de données en paramètre
    Par nico.cab dans le forum Développement
    Réponses: 7
    Dernier message: 17/09/2010, 16h04
  5. Base de donnée en paramètre
    Par DrizztDo dans le forum Développement
    Réponses: 5
    Dernier message: 29/09/2009, 15h34

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