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 :

CURSOR Imbriqués et FROM


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable de projet
    Inscrit en
    Juin 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2023
    Messages : 10
    Par défaut CURSOR Imbriqués et FROM
    Bonjour,

    Je souhaite mettre en place une double boucle via deux cursor.
    Le problème c'est que lorsque j'utilise la variable du premier cursor dans le FROM d'affectation du deuxième cursor, je me fait jeter...

    (Je cherche à boucler sur des tables ayant le même nom mais sur des serveurs différents)
    (Je n'ai pas de problème de connexion avec ces différents serveurs >> Serveur liées OK et testé OK)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    CREATE PROCEDURE spNomProcedure 
     
    AS
    	DECLARE @Id_Serveur AS VARCHAR(15);
     
    	DECLARE SERVEUR_CURSOR CURSOR FOR
     
    	SELECT Id_Serveur
    	FROM   [NomBase].[dbo].[ListeServeur]
     
    	OPEN SERVEUR_CURSOR
     
    	FETCH NEXT FROM SERVEUR_CURSOR INTO @Id_Serveur  
     
    	WHILE @@FETCH_STATUS = 0  
     
    	BEGIN
     
    		DECLARE @NonVariable VARCHAR (50) ;
     
    		DECLARE Ligne_CURSOR CURSOR FOR
     
    		SELECT @NonVariable
    		FROM   [@Id_Serveur].[Nom_Base].[dbo].NomTable    
     
    		/*  la variable @ dans le FROM ne passe pas... Dans le SELECT ou dans un WHERE c'est OK mais pas dans le FROM */
     
    		OPEN Ligne_CURSOR
     
    		FETCH NEXT FROM Ligne_CURSOR INTO @NonVariable 
     
    		WHILE @@FETCH_STATUS = 0  
     
    		BEGIN
     
    			PRINT 'Le serveur : ' +@Id_Serveur+ ' // Le nom de la Table : NomTable  // LA valeru de NomVariable : '+ @NonVariable ;	   
     
    		FETCH NEXT FROM Ligne_CURSOR INTO @NonVariable
    		END
    		CLOSE Ligne_CURSOR  
    		DEALLOCATE Ligne_CURSOR
     
    	FETCH NEXT FROM SERVEUR_CURSOR INTO @Id_Serveur
    	END
    	CLOSE SERVEUR_CURSOR  
    	DEALLOCATE SERVEUR_CURSOR
     
    GO
     
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
     
    EXEC spNomProcedure ;
    GO
    Savez vous pourquoi cela ne marche pas ?
    Auriez vous une idée pour résoudre mon problème ?

    Par avance, un grand merci

  2. #2
    Membre chevronné Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    Septembre 2021
    Messages
    547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : Septembre 2021
    Messages : 547
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @NonVariable FROM   [@Id_Serveur].[Nom_Base].[dbo].NomTable
    Cette ligne ne fonctionnera jamais, il faut passer par du sql dynamique pour faire ça.

  3. #3
    Membre averti
    Homme Profil pro
    Responsable de projet
    Inscrit en
    Juin 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2023
    Messages : 10
    Par défaut
    Bonjour,

    Merci pour ce premier retour.
    J'avais bien remarqué que cela ne fonctionné pas ;-)
    Ce que je ne comprend pas c'est pourquoi il valorise bien les variables @ quand elles sont utilisées dans un SELECT ou dans un WHERE mais pas dans le FROM ???

    Pour que je puisse aller plus loin dans mes recherches, pouvez-vous de donner un exemple de SQL Dynamique ?
    Ou me donner un peu plus de détail sur la façons de faite pour répondre à ce type de problématique.

    Par avance, un grand merci ;-)

  4. #4
    Membre chevronné Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    Septembre 2021
    Messages
    547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : Septembre 2021
    Messages : 547
    Par défaut
    https://blog.developpez.com/ylarvor/...ous_sql_server

    Citation Envoyé par QuelJean Voir le message
    Ce que je ne comprend pas c'est pourquoi il valorise bien les variables @ quand elles sont utilisées dans un SELECT ou dans un WHERE mais pas dans le FROM ???
    Les variables ne peuvent pas être employées directement pour remplacer les noms d'objets.

  5. #5
    Membre averti
    Homme Profil pro
    Responsable de projet
    Inscrit en
    Juin 2023
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2023
    Messages : 10
    Par défaut
    Re bonjour,

    J'ai tester avec du code dynamique.
    Voila mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
     
    USE QDD ;
    GO
     
    /*Suppression de la SP existante */
    DROP PROCEDURE dbo.spBoucleServeur ;  
    GO
     
    /* Création de la SP*/
    CREATE PROCEDURE spBoucleServeur
     
    AS
     
     	DECLARE @Nom_BDD_Icar AS VARCHAR(50) ;
    	DECLARE @Nom_Instance_Icar AS VARCHAR(50) ;
    	DECLARE @Id_Serveur AS VARCHAR(15);
     
    	DECLARE SERVEUR_CURSOR CURSOR FOR
     
    	SELECT Id_Serveur
    	FROM   [QDD].[dbo].[Serveur_ICAR]
     
    	OPEN SERVEUR_CURSOR
     
    	FETCH NEXT FROM SERVEUR_CURSOR INTO @Id_Serveur  
     
    	WHILE @@FETCH_STATUS = 0  
     
    	BEGIN
     
    		SET @Nom_BDD_Icar = (SELECT Nom_BDD_Icar FROM [QDD].[dbo].[Serveur_ICAR] WHERE Id_Serveur = @Id_Serveur) ;
    		SET @Nom_Instance_Icar = (SELECT Nom_Instance_Icar FROM [QDD].[dbo].[Serveur_ICAR] WHERE Id_Serveur = @Id_Serveur) ;
     
     
    		PRINT @Id_Serveur + @Nom_BDD_Icar + @Nom_Instance_Icar
     
     		DECLARE @Code_SQL AS VARCHAR(2000) ;
     
    		SET @Code_SQL = '
     
    			DECLARE @Codigo AS VARCHAR(15);
     
    			DECLARE TABLE_CURSOR CURSOR FOR
     
    			SELECT TOP(10) Codigo
    			FROM   ['+@Id_Serveur+'].['+@Nom_BDD_Icar+'].[dbo].[tgCliente]
     
    			OPEN TABLE_CURSOR
     
    			FETCH NEXT FROM TABLE_CURSOR INTO @Codigo  
     
    			WHILE @@FETCH_STATUS = 0  
     
    			BEGIN
     
    				PRINT @Codigo ;
     
    			FETCH NEXT FROM TABLE_CURSOR INTO @Codigo
    			END
    			CLOSE TABLE_CURSOR  
    			DEALLOCATE TABLE_CURSOR
     
    			GO
    		';
     
    		PRINT (@Code_SQL) ;		 /* PRINT OK avec du code exécutable */
    		EXEC (@Code_SQL) ;		 /* EXEC KO Message >> "Msg*102, Niveau*15, État*1, Ligne*136  Syntaxe incorrecte vers 'TABLE_CURSOR'." */
     
    	FETCH NEXT FROM SERVEUR_CURSOR INTO @Id_Serveur
    	END
    	CLOSE SERVEUR_CURSOR  
    	DEALLOCATE SERVEUR_CURSOR
     
    GO
     
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
     
    /* Execution de la SP */
    EXEC spBoucleServeur;
    GO
    La procédure tourne bien quand je met en commentaire le "EXEC (@Code_SQL) ;"
    Dans la log via le PRINT, j'ai un code qui tourne très bien (et qui fait ce que je veux) quand je le lance via une autre requête.
    Mais par contre quand je met le EXEC, j'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Msg*102, Niveau*15, État*1, Ligne*106
    Syntaxe incorrecte vers 'TABLE_CURSOR'.
    Auriez vous une solution ou une piste à me proposer.
    Je n'arrive pas a comprendre pourquoi mon code marche quand je l'exécute à part et qu'il ne marche pas quand je fait un EXCEC ????
    Merci beaucoup

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 992
    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 992
    Billets dans le blog
    6
    Par défaut
    Au lieu de toute cette programmation spaghetti, utilisez du SQL dynamique direct comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @SQL NVARCHAR(max) = N''
    SELECT @SQL = @SQL + N' SELECT TOP 10 ''Id_Serveur'' AS Id_Serveur, ''Nom_BDD_Icar'' AS Nom_BDD_Icar, ''Nom_Instance_Icar'' AS Nom_Instance_Icar , Codigo '
           + N'FROM [' + Id_Serveur + '].[' + Nom_BDD_Icar + '].[dbo].[tgCliente] UNION ALL '
    FROM   [QDD].[dbo].[Serveur_ICAR];
    SET @SQL = LEFT(@SQL, LEN(@SQL) - 10);
    EXEC (@SQL);
    Et apprenez le Transact SQL :
    http://mssqlserver.fr/petit-guide-de...-sql-partie-1/

    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/ * * * * *

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

Discussions similaires

  1. [COUNT] select ... from ... where count !
    Par tmcgrady dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/11/2007, 17h29
  2. "boutons" imbriqués !!
    Par biloubil dans le forum Flash
    Réponses: 9
    Dernier message: 04/12/2003, 14h03
  3. SYBASE SELECT imbriqué clause FROM
    Par Nicolas Martel dans le forum Sybase
    Réponses: 2
    Dernier message: 19/11/2003, 15h28
  4. Automatiser la mise à jour de la bD SQL SERVER from Access
    Par Nadaa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/11/2003, 15h23
  5. equivalent de select nextval from dual en SQL-Server ?
    Par toze dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/10/2003, 09h17

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